上篇博文介绍了变形矩阵的一些用法,所以这篇博文就结合变形矩阵来实现一个可以拖拽、缩放、旋转的图像吧。
首先,我们就继承ImageView来实现我们的自定义View。
代码如下:
public class MyMatrixImg extends ImageView {
private Context mContext;
private float startX,startY;
public MyMatrixImg(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
// 初始化
init();
}
private void init() {
/*
* 获取屏幕宽高
*/
WindowManager manager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
int Screenwidth = outMetrics.widthPixels;
int Screenheight = outMetrics.heightPixels;
/*
* 设置图片资源
*/
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.hibiki);
bitmap = Bitmap.createScaledBitmap(bitmap, Screenwidth, Screenheight, true);
setImageBitmap(bitmap);
}
}
这里我们加载本地的一张图片,并将其缩放成屏幕的大小。
拖拽的实现
拖拽,缩放,旋转这三种操作中,最简答的就是拖拽了。
在我们拖拽的时候只需要单点触控即可完成操作,而缩放旋转是需要多点触控来实现的。关于多点触控,后面再做详细介绍。
现在就先从最简答的入手。
单点触控大家应该都很熟悉了:
在处理单点触摸中,我们一般会用到MotionEvent.ACTION_DOWN
、ACTION_UP
、ACTION_MOVE
,然后可以用一个Switch语句来分别进行处理。ACTION_DOWN
和ACTION_UP
就是单点触摸屏幕,按下去和放开的操作,ACTION_MOVE
就是手指在屏幕上移动的操作。
下面就是只判断了单点触控的实现拖拽的代码:
public class MyMatrixImg extends ImageView {
private Context mContext;
private Matrix currentMatrix, savedMatrix;// Matrix对象
private float startX,startY;
public MyMatrixImg(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
// 初始化
init();
}
private void init() {
/*
* 实例化对象
*/
currentMatrix = new Matrix();
savedMatrix = new Matrix();
/*
* 获取屏幕宽高
*/
WindowManager manager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
int Screenwidth = outMetrics.widthPixels;
int Screenheight = outMetrics.heightPixels;
/*
* 设置图片资源
*/
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.hibiki);
bitmap = Bitmap.createScaledBitmap(bitmap, Screenwidth, Screenheight, true);
setImageBitmap(bitmap);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:// 单点接触屏幕时
savedMatrix.set(currentMatrix);
startX=event.getX();
startY=event.getY();
break;
case MotionEvent.ACTION_MOVE:// 触摸点移动时
currentMatrix.set(savedMatrix);
float dx = event.getX() - startX;
float dy = event.getY() - startY;
currentMatrix.postTranslate(dx, dy);
break;
case MotionEvent.ACTION_UP:// 单点离开屏幕时
break;
}
setImageMatrix(currentMatrix);
return true;
}
}
xml如下:
<com.example.administrator