第一种:根据点击位置确定图片的左上角
@SuppressWarnings("deprecation")
public class MoveImage extends Activity {
private ImageView mImageView01;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.move_image);
mImageView01 = (ImageView) findViewById(R.id.imageView1);
mImageView01.setImageResource(R.drawable.img1);
}
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
picMove(mImageView01, x, y);
break;
case MotionEvent.ACTION_MOVE:
picMove(mImageView01, x, y);
break;
case MotionEvent.ACTION_UP:
picMove(mImageView01, x, y);
break;
}
return super.onTouchEvent(event);
}
private void picMove(ImageView image, float x, float y) {
float positionX = x, positionY = y;
image.setDrawingCacheEnabled(true);
Bitmap bmp = Bitmap.createBitmap(image.getDrawingCache());
image.setDrawingCacheEnabled(false);
int intHeight = bmp.getHeight();
int intWidth = bmp.getWidth();
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm); /* 取得屏幕解析像素 */
int intScreenX = dm.widthPixels;
int intScreenY = dm.heightPixels;
if(x >= ( intScreenX - intWidth ) && y <= ( intScreenY - intHeight )){
positionX = intScreenX - intWidth;
}
else if(x <= ( intScreenX - intWidth ) && y >= ( intScreenY - intHeight )){
positionY = intScreenY - intHeight;
}
else if(x > ( intScreenX - intWidth ) && y > ( intScreenY - intHeight )){
positionX = intScreenX - intWidth;
positionY = intScreenY - intHeight;
}
image.setLayoutParams(new AbsoluteLayout.LayoutParams(intWidth,
intHeight, (int) positionX, (int) positionY));
}
}
注意:layout的xml文件的imageView必须包含在AbsoluteLayout中
第二种:根据点击位置确定图片的中心位置
@SuppressWarnings("deprecation")
public class MoveImage2 extends Activity {
private ImageView mImageView01;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.move_image);
mImageView01 = (ImageView) findViewById(R.id.imageView1);
mImageView01.setImageResource(R.drawable.img1);
}
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
picMove(mImageView01, x, y);
break;
case MotionEvent.ACTION_MOVE:
picMove(mImageView01, x, y);
break;
case MotionEvent.ACTION_UP:
picMove(mImageView01, x, y);
break;
}
return super.onTouchEvent(event);
}
private void picMove(ImageView image, float x, float y) {
image.setDrawingCacheEnabled(true);
Bitmap bmp = Bitmap.createBitmap(image.getDrawingCache());
image.setDrawingCacheEnabled(false);
int intHeight = bmp.getHeight();
int intWidth = bmp.getWidth();
float positionX = x - intWidth/2, positionY = y - intHeight/2;
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm); /* 取得屏幕解析像素 */
int intScreenX = dm.widthPixels;
int intScreenY = dm.heightPixels;
if(x <= (intWidth / 2) && y <= (intHeight / 2)){
positionX = 0;
positionY = 0;
}
else if(x <= (intWidth / 2) && y >= (intScreenY - intHeight / 2)){
positionX = 0;
positionY = intScreenY - intHeight;
}
else if(x >= (intScreenX - intWidth / 2) && y <= (intHeight / 2)){
positionX = intScreenX - intWidth;
positionY = 0;
}
else if(x >= (intScreenX - intWidth / 2) && y >= (intScreenY - intHeight / 2)){
positionX = intScreenX - intWidth;
positionY = intScreenY - intHeight;
}
else if(x <= (intScreenX - intWidth / 2) && x >= (intWidth / 2) && y <= (intHeight / 2)){
positionY = 0;
}
else if(x <= (intScreenX - intWidth / 2) && x >= (intWidth / 2) && y >= (intScreenY - intHeight / 2)){
positionY = intScreenY - intHeight;
}
else if(x <= (intWidth / 2) && y <= (intScreenY - intHeight / 2) && y >= (intHeight / 2)){
positionX = 0;
}
else if(x >= (intScreenX - intWidth / 2) && y <= (intScreenY - intHeight / 2) && y >= (intHeight / 2)){
positionX = intScreenX - intWidth;
}
image.setLayoutParams(new AbsoluteLayout.LayoutParams(intWidth,
intHeight, (int) positionX, (int) positionY));
}
}
- 大小: 49.8 KB
- 大小: 49.4 KB
分享到:
相关推荐
在Android开发中,手势控制是用户界面交互的重要组成部分,特别是在图像视图(ImageView)的处理上,手势控制能够实现图片的缩放和移动,提供更加丰富的用户体验。本篇将详细探讨如何实现标题“手势控制ImageView...
通过以上步骤,我们就能够为Android的ImageView添加多点触碰功能,使用户可以自由地拖拽和缩放图片。在实际开发中,可以根据具体需求进行调整和优化,例如添加手势识别库如GestureDetector或ScaleGestureDetector来...
在Android开发中,手势识别是实现用户交互的重要一环,特别是在UI组件的动态操作上,如ImageView的缩放和移动。本教程将深入探讨如何通过手势控制ImageView的这些功能,以便提升用户的使用体验。 首先,我们需要...
而实现ImageView的拖拽功能,可以增强用户体验,使得用户能自由调整图像的位置,这在某些场景下非常有用,比如自定义布局或者交互式图像查看应用。 在“Android ImageView 拖拽实例”中,我们主要关注的是如何赋予...
自定义ImageView 封装(jar): 图片放大缩小,自由移动等实例
通过以上步骤,我们可以实现用户通过手势自由缩放和移动ImageView的功能,从而提供更加直观和自然的交互体验。在实际项目中,还可以结合SmoothZoom动画或其他视觉效果,使操作更加流畅。在GestureDemo这个项目中,你...
最后,为了更好地支持拖动,可能需要对布局进行适当的调整,确保View可以在父布局中自由移动。例如,使用`android:layout_gravity="center"`将View居中,然后通过移动来改变位置,而不是直接设置具体的坐标。 总的...
然而,对于一些高级功能,如多点触控、双击缩放和自由移动,原生的ImageView往往无法满足需求。本篇文章将深入探讨如何通过自定义控件ZoomImageView实现这些功能,并在结合ViewPager时处理可能的事件冲突。 首先,...
在Android开发中,有时我们需要创建一个用户可以自由拖动、缩放甚至旋转的ImageView,以提供更加丰富的交互体验。这个自定义的`DragZoom ImageView`就是为此目的设计的。在这个组件中,我们主要关注三个核心功能:...
这通常涉及到自定义控件,以便实现图片的自由移动、自由缩放以及多点触控操作,比如双击放大缩小。本教程将深入探讨如何实现这样一个功能强大的图片查看器。 首先,我们需要创建一个自定义的ImageView子类,我们...
- **旋转**:为了实现旋转,我们需要记录初始的旋转角度,然后在每次手指移动时计算新的旋转角度,通过`postRotate()`方法更新ImageView的Matrix。 - **平移**:平移操作可以通过改变Matrix的translationX和...
总的来说,这个JavaFX项目提供了一种实现图片在用户界面中自由放大、缩小和移动的方法。通过学习和理解这个示例,开发者可以更好地掌握JavaFX中图片操作的技巧,这对于开发富媒体应用或者图形编辑工具非常有帮助。
`matrix`模式允许自定义矩阵变换,这意味着我们可以自由地对图像进行平移、缩放等操作,非常适合实现拖动和缩放的功能。 接下来,我们来创建一个自定义的`DraggableImageView`类,这个类继承自`ImageView`,并添加`...
本教程将深入探讨如何创建一个自定义的ImageView,实现多点触控功能,以支持图片的自由移动和缩放,同时解决与ViewPager的兼容性问题。 首先,我们需要了解多点触控的基本原理。在Android中,多点触控是通过`...
- 滑动切换:通过`TranslateAnimation`实现图像的平滑移动,常用于轮播图。 5. 图片裁剪: - 使用`Bitmap.createBitmap()`方法,配合Matrix对图片进行裁剪。 - 第三方库CropImage提供更高级的裁剪功能,包括自由...
然而,标准的ImageView往往无法满足开发者对于图片缩放的特定需求,例如自由调整缩放的最大和最小比例。这时,自定义一个可缩放的ImageView就显得尤为重要。这个自定义的组件通常被称为“自定义缩放ImageView”。 ...
在Android开发中,实现一个可自由移动的悬浮窗口通常涉及到`WindowManager`服务的使用。`WindowManager`是Android系统提供的一个接口,允许应用程序在窗口管理器中添加、删除或配置视图。在这个主题中,我们将深入...
这个"Android 图片移动"的功能,主要是让用户能够通过触摸屏幕,拖动图片在界面上自由移动,实现一种交互式的用户体验。以下是一些关于实现这一功能的关键知识点: 1. **ImageView**: 图片显示的基本组件是`...
1. **平移(Panning)功能**:用户可以通过手指拖动来改变图片的位置,实现图片在屏幕上的自由移动。这通常涉及到手势识别,需要监听并处理MotionEvent事件,尤其是ACTION_DOWN、ACTION_MOVE和ACTION_UP等事件。 2. *...
Xamarin是一个使用C#和.NET框架开发原生移动应用的工具,它允许开发者用相同的编程语言和API来开发iOS、Android和Windows应用。 至于Apache,这可能指的是Apache License 2.0,源码可能采用了这个开源许可协议,...