package cn.qylk.myview; import android.content.Context; import android.graphics.Matrix; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ImageView; /** * 带触感的ImageView,按下时图片会变小,松开便恢复原状 * * @author qylk2012 <br> * all rights reserved * */ public class MyImageView extends ImageView { public interface OnViewClick { public void onClick(int id); } private static int alpha = 220; private static final int ANIMATION_START = 1, RESTORE_START = 2; private Handler handler = new Handler() { private Matrix matrix = new Matrix(); @Override public void handleMessage(Message msg) { super.handleMessage(msg); matrix.set(getImageMatrix()); switch (msg.what) { case ANIMATION_START:// 开始缩小 if (!isFinish) { return; } else { isFinish = false; BeginScale(matrix, Scale); isFinish = true; } break; case RESTORE_START:// 恢复大小 if (!isFinish) { handler.sendEmptyMessage(RESTORE_START); } else { isFinish = false; BeginScale(matrix, 1.0f / Scale); if (!isActionMove && onclick != null) onclick.onClick(getId()); isFinish = true; } break; } } }; private boolean isFinish = true, isActionMove; OnViewClick onclick = null; private float Scale = 0.94f; private int vWidth, vHeight; public MyImageView(Context context) { this(context, null); } public MyImageView(Context context, AttributeSet attrs) { super(context, attrs); setAlpha(alpha); } /** * 图片缩放 * * @param matrix * @param scale * >1.0放大,<1.0缩小 */ private synchronized void BeginScale(Matrix matrix, float scale) { matrix.postScale(scale, scale, vWidth / 2, vHeight / 2);// 从中心位置缩放 setImageMatrix(matrix); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { vWidth = w - getPaddingLeft() - getPaddingRight(); vHeight = h - getPaddingTop() - getPaddingBottom(); super.onSizeChanged(w, h, oldw, oldh); } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: isActionMove = false; handler.sendEmptyMessage(ANIMATION_START); break; case MotionEvent.ACTION_MOVE: float x = event.getX(); float y = event.getY(); if (x > vWidth || y > vHeight || x < 0 || y < 0) {// 触控不在控件上 isActionMove = true; } else { isActionMove = false; } break; case MotionEvent.ACTION_UP: handler.sendEmptyMessage(RESTORE_START); break; case MotionEvent.ACTION_CANCEL: isActionMove = true; handler.sendEmptyMessage(RESTORE_START); break; } return true; } public void setOnClickIntent(OnViewClick onclick) { this.onclick = onclick; } }