Android 重寫ImageView實現圖片手勢功能

通過這個XImageView.java類,可實現單點觸摸移動,以及雙指縮放圖片功能。

使用時,只要在布局文件中引入,并在Java代碼中按照原生ImageView設置要顯示的圖片即可。

代碼如下(僅供參考):

import android.annotation.SuppressLint;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Matrix;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.widget.ImageView;

public class XImageView extends ImageView {

public static Bitmap gintama;

private Matrix matrix;

private float point1_old_x, point1_old_y, point1_new_x, point1_new_y,point2_old_x, point2_old_y,point2_new_x, point2_new_y,distance_old, distance_new;

private float point_old_x, point_old_y, point_new_x, point_new_y;

private boolean isMultiTouch = false;

public XImageView(Context context, AttributeSet attrs) {

super(context, attrs);

gintama = BitmapFactory.decodeResource(getResources(),

R.drawable.ic_launcher);

matrix = new Matrix();

}

public XImageView(Context context) {

super(context);

gintama = BitmapFactory.decodeResource(getResources(),

R.drawable.ic_launcher);

matrix = new Matrix();

}

// 回調方法,用于畫控件上的圖片

@Override

protected void onDraw(Canvas canvas) {

canvas.save();

canvas.drawBitmap(gintama, matrix, null);

canvas.restore();

}

@SuppressLint("ClickableViewAccessibility")

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:

// 單點移動 按下

if (event.getPointerCount() == 1) {

isMultiTouch = false;

point_old_x = event.getX();

point_old_y = event.getY();

}

break;

case MotionEvent.ACTION_UP:

// 單點移動 抬起

if (event.getPointerCount() == 1) {

isMultiTouch = false;

point_old_x = point_new_x;

point_old_y = point_new_y;

}

break;

case MotionEvent.ACTION_POINTER_UP:

// 雙點操作 抬起

if (event.getPointerCount() == 2) {

isMultiTouch = true;

point1_old_x = point1_new_x;

point1_old_y = point1_new_y;

point2_old_x = point2_new_x;

point2_old_y = point2_new_y;

}

break;

case MotionEvent.ACTION_POINTER_DOWN:

// 雙點操作 按下

if (event.getPointerCount() == 2) {

isMultiTouch = true;

point1_old_x = event.getX(0);

point1_old_y = event.getY(0);

point2_old_x = event.getX(1);

point2_old_y = event.getY(1);

distance_old = (float) Math.sqrt(((point1_old_x - point2_old_x)* (point1_old_x - point2_old_x) + (point1_old_y - point2_old_y) * (point1_old_y - point2_old_y)));

}

break;

case MotionEvent.ACTION_MOVE:

// 雙點操作 移動

if (event.getPointerCount() == 2) {

isMultiTouch = true;

point1_new_x = event.getX(0);

point1_new_y = event.getY(0);

point2_new_x = event.getX(1);\

point2_new_y = event.getY(1);

pinch();

} else {

// 單點移動 移動

if (event.getPointerCount() == 1) {

if (!isMultiTouch) {

point_new_x = event.getX();

point_new_y = event.getY();

matrix.postTranslate((point_new_x - point_old_x),(point_new_y - point_old_y));

point_old_x = point_new_x;

point_old_y = point_new_y;

invalidate();

}

}

}

break;

}

return true;

}

// 縮放圖片方法

private void pinch() {

distance_new = (float) Math.sqrt(((point1_new_x - point2_new_x)* (point1_new_x - point2_new_x) + (point1_new_y - point2_new_y) * (point1_new_y - point2_new_y)));

matrix.postScale((distance_new / distance_old),(distance_new / distance_old), this.getWidth() / 2,? this.getTop() / 2);

invalidate();

distance_old = distance_new;

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容