Android图片放大缩小移动

Android 图片放大缩小移动(记录)

学习记录下

//UI界面
<ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:scaleType="matrix"
        android:src="@drawable/de" />
//主功能代码
public class MainActivity extends AppCompatActivity {

    private ImageView iv;
    public final int MODE_NONE=0;//什么都没做
    public final int MODE_DRAG=1;//拖拽
    public final int MODE_ZOOM=2;//放大缩小
    public int MODE;//一开始的状态
    public Matrix StartMatrix=new Matrix();//当前矩阵
    public Matrix CurrentMatrix=new Matrix();//变化的矩阵
    public PointF pointF=new PointF();//初始坐标
    public float distance;//一开始手指两点之间的距离


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initEvent();
    }

    private void initEvent() {
        iv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                switch (event.getAction()&event.getActionMasked())
                {
                    case MotionEvent.ACTION_DOWN:
                        /*按下屏幕触发该事件*/
                        MODE=MODE_DRAG;
                        StartMatrix.set(iv.getImageMatrix());
                        pointF.set(event.getX(),event.getY());
                        break;

                    case MotionEvent.ACTION_POINTER_DOWN:
                        /*第二个手指触碰屏幕焦点*/
                        MODE=MODE_ZOOM;
                        CurrentMatrix.set(StartMatrix);
                        distance=getDistance(event);
                        break;

                    case MotionEvent.ACTION_MOVE:
                        /*移动*/
                        if(MODE==MODE_DRAG)
                        {
                      CurrentMatrix.set(StartMatrix);
                      CurrentMatrix.postTranslate(event.getX()-pointF.x,event.getY()-pointF.y);
                        }

                        if(MODE==MODE_ZOOM)
                        { 
                            float CurrentDistance=getDistance(event);
                            //移动后的两点之间的距离
                            float scale=CurrentDistance/distance;
                               //计算缩放倍数  现在的距离/以前的距离=倍数
                            CurrentMatrix.set(StartMatrix);
                            CurrentMatrix.postScale(scale,scale,pointF.x,pointF.y);
                        }
                        break;

                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_POINTER_UP:
                        /*手指离开屏幕 失去焦点*/
                        MODE=MODE_NONE;

                        break;
                }
                iv.setImageMatrix(CurrentMatrix);
                return true;
            }
        });
    }


    public float getDistance(MotionEvent event)
    {
        /*求两点之间的距离*/
       float x= (event.getX(0)-event.getX(1))*(event.getX(0)-event.getX(1));
        float y=(event.getY(0)-event.getY(1))*(event.getY(0)-event.getY(1));
       return  (float)Math.sqrt((x+y));
    }


    private void initView() {
        iv = (ImageView) findViewById(R.id.iv);
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值