Android ImageView仿win8 Metro效果

public class MyImageView extends ImageView {

    private static final int SCALE_REDUCE_INIT = 0;
    private static final int SCALING = 1;
    private static final int SCALE_ADD_INIT = 2;

    /**
     * 控件宽度1/2
     */
    private int mCenterWidth;
    /**
     * 控件高度1/2
     */
    private int mCenterHeight;
    /**
     * 缩放是否结束
     */
    private boolean isFinish = true;

    public MyImageView(Context context) {
        this(context, null);
    }

    public MyImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        if (changed) {
            int mWidth = getWidth() - getPaddingLeft() - getPaddingRight();
            int mHeight = getHeight() - getPaddingTop() - getPaddingBottom();
            mCenterWidth = mWidth / 2;
            mCenterHeight = mHeight / 2;
            Drawable drawable = getDrawable();
            BitmapDrawable bd = (BitmapDrawable) drawable;
            bd.setAntiAlias(true);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //float X = event.getX();
                //float Y = event.getY();
                mScaleHandler.sendEmptyMessage(SCALE_REDUCE_INIT);
                break;
            case MotionEvent.ACTION_UP:
                mScaleHandler.sendEmptyMessage(SCALE_ADD_INIT);
                break;
        }
        return true;
    }

    /**
     * 控制缩放Handler
     */
    private final Handler mScaleHandler = new Handler() {
        private Matrix matrix = new Matrix();
        private int count = 0;
        private float mMinScale = 0.8f;
        private float scale;
        private boolean isClicked;//是否调用了点击事件

        public void handleMessage(Message msg) {
            matrix.set(getImageMatrix());
            switch (msg.what) {
                case SCALE_REDUCE_INIT:
                    if (!isFinish) {
                        mScaleHandler.sendEmptyMessage(SCALE_REDUCE_INIT);
                    } else {
                        isFinish = false;
                        count = 0;
                        scale = (float) Math.sqrt(Math.sqrt(mMinScale));
                        beginScale(matrix, scale);
                        mScaleHandler.sendEmptyMessage(SCALING);
                    }
                    break;
                case SCALING:
                    beginScale(matrix, scale);
                    if (count < 4) {
                        mScaleHandler.sendEmptyMessage(SCALING);
                    } else {
                        isFinish = true;
                        if (MyImageView.this.mOnViewClickListener != null && !isClicked) {
                            isClicked = true;
                            MyImageView.this.mOnViewClickListener.onViewClick(MyImageView.this);
                        } else {
                            isClicked = false;
                        }
                    }
                    ++count;
                    break;
                case SCALE_ADD_INIT:
                    if (!isFinish) {
                        mScaleHandler.sendEmptyMessage(SCALE_ADD_INIT);
                    } else {
                        isFinish = false;
                        count = 0;
                        scale = (float) Math.sqrt(Math.sqrt(1.0f / mMinScale));
                        beginScale(matrix, scale);
                        mScaleHandler.sendEmptyMessage(SCALING);
                    }
                    break;
            }
        }
    };

    protected void sleep(int time) {
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 缩放
     *
     * @param matrix matrix
     * @param scale  scale
     */
    private synchronized void beginScale(Matrix matrix, float scale) {
        matrix.postScale(scale, scale, mCenterWidth, mCenterHeight);
        setImageMatrix(matrix);
    }

    /**
     * 接口回调
     */
    private OnViewClickListener mOnViewClickListener;

    public void setOnViewClickListener(OnViewClickListener mOnViewClickListener) {
        this.mOnViewClickListener = mOnViewClickListener;
    }

    public static interface OnViewClickListener {
        void onViewClick(MyImageView view);
    }
}

你可能感兴趣的:(Android ImageView仿win8 Metro效果)