Android中自定义点击缩放ImageView

本文介绍如何在Android中实现一个自定义的ImageView,该ImageView在点击后能够产生缩放效果。通过继承ImageView并利用Matrix进行图片的缩放、旋转和平移等操作。文章详细讲解了构造方法、onDraw()、OnTouchEvent()以及如何处理点击事件以实现边缘和中心的缩放效果。此外,还提到了需要设置ImageView的scaleType为matrix,并提供了完整的源码供参考。
摘要由CSDN通过智能技术生成

我们平时在开发中,有时候需要在点击控件后有一个缩放效果,当然,有些朋友会讲这很简单啊,在资源文件中给两个不同的背景,用selecter作为切换,可以达到需要的效果,或者用动画,这也很好的实现需求。但是,今天我们要做的这个点击缩放控件不单单是缩放那么简单,请看效果图!
点击边缘缩放效果点击中心缩放效果
首先,要实现以上效果,我们要自定义View继承Imageview,通过Imageview的Matrix来设置图片的缩放,旋转,平移等等。开始初始化参数:

   /**
     * 是否执行中
     */
    private boolean onAnimation = true;
    /**
     * 旋转角度
     */
    private int rotateDegree = 10;

    private boolean isFirst = true;
    /**
     * 比例
     */
    private float minScale = 0.95f;
    /**
     * 控件宽度
     */
    private int vWidth;
    /**
     * 控件高度
     */
    private int vHeight;
    private boolean isFinish = true, isActionMove = false, isScale = false;
    /**
     * 相机api
     */
    private Camera camera;

    boolean XbigY = false;
    float RolateX = 0;
    float RolateY = 0;

这里要说明一下,Camera类在这里,主要用于,图片的处理。好 了,接下来初始化构造方法,同时Camera也创建出来。

 public MyImageView(Context context) {
        super(context);
        camera = new Camera();
    }

    public MyImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        camera = new Camera();
    }

这样我们就可以开始在ondraw()里面操作各种数据了,下面重写ondraw()并在里面初始化,这里有一个判断是否是第一次展示,用了isFirst来做标志位,如果第一次就初始化参数,如果不是就 不再初始化参数了。当然这个直接写在构造方法里面也可以。

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (isFirst) {
            isFirst = false;
            //初始化
            init();
        }
        //为画布设置抗锯齿
        canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
                | Paint.FILTER_BITMAP_FLAG));
    }
  /**
     * 初始化
     */
    public void init() {
        vWidth = getWidth() - getPaddingLeft() - getPaddingRight();
        vHeight = getHeight() - getPaddingTop() - getPaddingBottom();
        Drawable drawable = getDrawable();
        BitmapDrawable bd = (BitmapDrawable) drawable;
        /**画笔设置抗锯齿
         */
        bd.setAntiAlias(true);
    }

上面的init()方法中getDrawable()方法作用就是得到Imageview的显示图片。这下我们就应该开始处理点击事件了。重写OnTuchEvent()在里面分别处理Down,Move,Up事件。

@Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        if (!onAnimation)
            return true;

        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                float X = event.getX();
                float Y = event.getY();
                RolateX = vWidth / 2 - X;
                RolateY = vHeight / 2 - Y;
                XbigY = Math.abs(RolateX) > Math.abs(RolateY) ? true : false;
                //这里判断缩放区域
                isScale = X > vWidth / 3 && X < vWidth * 2 / 3 && Y > vHeight / 3 && Y < vHeight * 2 / 3;
                isScale = true;
                isActionMove = false;

                if (isScale) {
                    handler.sendEmptyMessage(1);
                } else {
                    rolateHandler.sendEmptyMessage(1);
                }
                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:
                if (isScale) {
                    handler.sendEmptyMessage(6);
                } else {
                    rolateHandler.sendEmptyMessage(6);
                }
                break;
        }
        return true;
    }

当检测到点击区域位于View的位置后,就通过handler发送消息,在handler里面处理,缩放操作。在这里我们分为两个效果,1.点击View边缘,所在边缘缩放效果。2.点击View中心四周缩放。这样rolateHandler用于边缘缩放,handler用于四周缩放。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值