拖动,缩放imageview没有矩阵android [英] drag, zoom imageview without matrix android

查看:164
本文介绍了拖动,缩放imageview没有矩阵android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一个实现拖放和缩放的解决方案,在不使用矩阵的情况下在屏幕onTouch事件周围路由ImageView。
i搜索了很多,但所有答案都用矩阵完成,因为我在屏幕矩阵中有多个对象不适合我,我想在ImageView中拖放ImageView对象而不是矩阵,经过一些尝试我实现了一个类拖动视图很好,但在缩放它打扰,谢谢,如果有人可以帮助我,抱歉语言能力差,如果我有拼写错误。

i need a solution for implement drag and zoom , routate ImageView around screen onTouch event without using matrix. i searched a lot but all answers done it with matrix and because i have multi objects in screen matrix is not suitable for me, i want drag and zoom ImageView object not matrix in the ImageView, after some try i implement a class that drag view fine but in zoom it disturb, thanks if someone can help me and sorry for bad language skills and if i have misspelling.

package com.example.painting1;

import android.graphics.PointF;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class Drag implements OnTouchListener {

    ImageView img;

    // We can be in one of these 3 states
    private static final int NONE = 0;
    private static final int DRAG = 1;
    private static final int ZOOM = 2;

    private int mode = NONE;

    private PointF mid = new PointF();

    PointF DownPT = new PointF(); // Record Mouse Position When Pressed Down
    PointF StartPT = new PointF(); // Record Start Position of 'img'

    float oldDist = 1f;

    public Drag( ImageView img ) {
        // TODO Auto-generated constructor stub
        this.img = img;
        img.setOnTouchListener(this);
    }

        private float spacing(MotionEvent event) {
            float x = event.getX(0) - event.getX(1);
            float y = event.getY(0) - event.getY(1);
            return FloatMath.sqrt(x * x + y * y);
        }

        /**
         * Calculate the mid point of the first two fingers
         */
        private void midPoint(PointF point, MotionEvent event) {
            float x = event.getX(0) + event.getX(1);
            float y = event.getY(0) + event.getY(1);
            point.set(x / 2, y / 2);
        }

        @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                int evid = event.getAction();
                int moid = MotionEvent.ACTION_MASK;

                switch (evid & moid)
                {
                    case MotionEvent.ACTION_MOVE :

                       if (mode == DRAG) {                      
                                PointF mv = new PointF( event.getX() - DownPT.x, event.getY() - DownPT.y);
                                img.setX((int)(StartPT.x+mv.x));
                                img.setY((int)(StartPT.y+mv.y));
                                StartPT = new PointF( img.getX(), img.getY() );
                        }

                         else if (mode == ZOOM) {
                                    float newDist = spacing(event);
                                    if (newDist > 10f) {
                                        //matrix.set(savedMatrix);
                                        float scale = (newDist / oldDist);
                                        //matrix.postScale(scale, scale, mid.x, mid.y);

                                        img.layout((int)scale, (int)scale, (int)mid.x, (int)mid.y);

                                        img.setScaleX(scale);
                                        img.setScaleY(scale);
                                    }
                         }

                        break;

                    case MotionEvent.ACTION_DOWN :

                        mode = DRAG;

                        DownPT.x = event.getX();
                        DownPT.y = event.getY();
                        StartPT = new PointF( img.getX(), img.getY() );
                        break;
                    case MotionEvent.ACTION_UP :
                        // Nothing have to do
                    case MotionEvent.ACTION_POINTER_UP :
                            mode = NONE;
                        break;

                    case MotionEvent.ACTION_POINTER_DOWN :

                        oldDist = spacing(event);
                        if (oldDist > 10f) {
                            //savedMatrix.set(matrix);
                            midPoint(mid, event);
                            mode = ZOOM;
                        }
                        break;
                    default :
                        break;
                }
                return true;
        }
}


推荐答案

尝试这段代码

I have a solution for you,I wish it will work for you,

try to use TouchImageView instead of ImageView in Layout.because touchimageview have property that zooming in or out itself

https://github.com/MikeOrtiz/TouchImageView 

从这个链接中你学会了如何使用touchimageview ...

from this link you learn how to use touchimageview...

<com.luminous.pick.TouchImageView
                android:id="@+id/img2"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

Then After implement onDragListener of TouchImageView so you can get DRAG And Drop of Imageview easily...

@Override
public boolean onDrag(View v, DragEvent event) {

    switch (event.getAction()) {

        case DragEvent.ACTION_DROP:

            TouchImageView target = (TouchImageView) v;
            TouchImageView dragged = (TouchImageView) event.getLocalState();

            Drawable target_draw = target.getDrawable();
            Drawable dragged_draw = dragged.getDrawable();

            dragged.setImageDrawable(target_draw);
            target.setImageDrawable(dragged_draw);

   }
    return true;
}

这篇关于拖动,缩放imageview没有矩阵android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆