Android ImageView,OnTouchEvent没有移动它

时间:2014-03-05 14:50:10

标签: android imageview ontouchlistener

我正在尝试创建一个简单的应用程序,其中可以使用按钮放大和缩小图像视图,并且在缩放时,用户可以用手指移动它。

我一整天都在阅读,在这里和那里,找到了不同的解决方案。但我似乎无法让我的照片移动。事实是,我想保持现在的程序,但只是改变imageview OnTouchEvent

我正在添加我的代码:

public class LoadMap extends Activity {
ZoomControls zoom;
ImageView img;
ImageButton linkButton;
float startX, startY;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_load_map);

        zoom = (ZoomControls) findViewById(R.id.zoomControls1);
        img = (ImageView) findViewById(R.id.imageView1);
        linkButton = (ImageButton) findViewById(R.id.infopoint);

        startX = img.getScaleX();
        startY = img.getScaleY();

        img.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                    if(event.getAction() == MotionEvent.ACTION_MOVE) {
                        RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) img.getLayoutParams();

                        int x = (int) event.getRawX();
                        int y = (int) event.getRawY();

                        mParams.leftMargin = x;
                        mParams.topMargin = y;

                        img.setLayoutParams(mParams);                           
                    }
                return false;
            }
        });

        linkButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Uri uri = Uri.parse("just some site");
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);                  
            }
        });

        zoom.setOnZoomInClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                float x = img.getScaleX();
                float y = img.getScaleY();

                img.setScaleX((float) (x+1));
                img.setScaleY((float) (y+1));                   
            }
        });

        zoom.setOnZoomOutClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                float x = img.getScaleX();
                float y = img.getScaleY();
                if((x>startX) & (y>startY)) {
                    img.setScaleX((float) (x-1));
                    img.setScaleY((float) (y-1));
                }
            }
        });
}

有没有办法只更改此方法中的一些内容而不会过多地弄乱我的应用程序,这甚至可能是我尝试使其工作或我的程序逻辑错误的方式。

img.setOnTouchListener(new OnTouchListener() {          
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                    if(event.getAction() == MotionEvent.ACTION_MOVE) {
                        RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) img.getLayoutParams();

                        int x = (int) event.getRawX();
                        int y = (int) event.getRawY();

                        mParams.leftMargin = x;
                        mParams.topMargin = y;

                        img.setLayoutParams(mParams);                           
                    }
                return false;
            }
        });

很抱歉,如果以前曾被问到,但我搜索了很多,但找不到任何具体的问题。 非常感谢任何花时间在我的问题上的人:)。

3 个答案:

答案 0 :(得分:0)

尝试使用自定义ImageVIew

public class ZoomableImageView extends ImageView implements OnTouchListener {
    private Context mContext;
    final private float MAX_SCALE = 2f;

    private Matrix mMatrix;
    private final float[] mMatrixValues = new float[9];

    // display width height.
    private int mWidth;
    private int mHeight;

    private int mIntrinsicWidth;
    private int mIntrinsicHeight;

    private float mScale;
    private float mMinScale;

    private float mPrevDistance;
    private boolean isScaling;

    private int mPrevMoveX;
    private int mPrevMoveY;
    private GestureDetector mDetector;

    final String TAG = "ScaleImageView";

    public ZoomableImageView(Context context, AttributeSet attr) {
        super(context, attr);
        this.mContext = context;
        initialize();
    }

    public ZoomableImageView(Context context) {
        super(context);
        this.mContext = context;
        initialize();
    }

    @Override
    public void setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        this.initialize();
    }

    @Override
    public void setImageResource(int resId) {
        super.setImageResource(resId);
        this.initialize();
    }

    private void initialize() {
        this.setScaleType(ScaleType.MATRIX);
        this.mMatrix = new Matrix();
        Drawable d = getDrawable();
        if (d != null) {
            mIntrinsicWidth = d.getIntrinsicWidth();
            mIntrinsicHeight = d.getIntrinsicHeight();
            setOnTouchListener(this);
        }
        mDetector = new GestureDetector(mContext,
                new GestureDetector.SimpleOnGestureListener() {
                    @Override
                    public boolean onDoubleTap(MotionEvent e) {
                        maxZoomTo((int) e.getX(), (int) e.getY());
                        cutting();
                        return super.onDoubleTap(e);
                    }
                });

    }

    @Override
    protected boolean setFrame(int l, int t, int r, int b) {
        mWidth = r - l;
        mHeight = b - t;

        mMatrix.reset();
        int rNorm = r - l;
        mScale = (float) rNorm / (float) mIntrinsicWidth;

        int paddingHeight = 0;
        int paddingWidth = 0;
        // scaling vertical
        if (mScale * mIntrinsicHeight > mHeight) {
            mScale = (float) mHeight / (float) mIntrinsicHeight;
            mMatrix.postScale(mScale, mScale);
            paddingWidth = (r - mWidth) / 2;
            paddingHeight = 0;
            // scaling horizontal
        } else {
            mMatrix.postScale(mScale, mScale);
            paddingHeight = (b - mHeight) / 2;
            paddingWidth = 0;
        }
        mMatrix.postTranslate(paddingWidth, paddingHeight);

        setImageMatrix(mMatrix);
        mMinScale = mScale;
        zoomTo(mScale, mWidth / 2, mHeight / 2);
        cutting();
        return super.setFrame(l, t, r, b);
    }

    protected float getValue(Matrix matrix, int whichValue) {
        matrix.getValues(mMatrixValues);
        return mMatrixValues[whichValue];
    }

    protected float getScale() {
        return getValue(mMatrix, Matrix.MSCALE_X);
    }

    public float getTranslateX() {
        return getValue(mMatrix, Matrix.MTRANS_X);
    }

    protected float getTranslateY() {
        return getValue(mMatrix, Matrix.MTRANS_Y);
    }

    protected void maxZoomTo(int x, int y) {
        if (mMinScale != getScale() && (getScale() - mMinScale) > 0.1f) {
            // threshold 0.1f
            float scale = mMinScale / getScale();
            zoomTo(scale, x, y);
        } else {
            float scale = MAX_SCALE / getScale();
            zoomTo(scale, x, y);
        }
    }

    public void zoomTo(float scale, int x, int y) {
        if (getScale() * scale < mMinScale) {
            return;
        }
        if (scale >= 1 && getScale() * scale > MAX_SCALE) {
            return;
        }
        mMatrix.postScale(scale, scale);
        // move to center
        mMatrix.postTranslate(-(mWidth * scale - mWidth) / 2,
                -(mHeight * scale - mHeight) / 2);

        // move x and y distance
        mMatrix.postTranslate(-(x - (mWidth / 2)) * scale, 0);
        mMatrix.postTranslate(0, -(y - (mHeight / 2)) * scale);
        setImageMatrix(mMatrix);
    }

    public void cutting() {
        int width = (int) (mIntrinsicWidth * getScale());
        int height = (int) (mIntrinsicHeight * getScale());
        if (getTranslateX() < -(width - mWidth)) {
            mMatrix.postTranslate(-(getTranslateX() + width - mWidth), 0);
        }
        if (getTranslateX() > 0) {
            mMatrix.postTranslate(-getTranslateX(), 0);
        }
        if (getTranslateY() < -(height - mHeight)) {
            mMatrix.postTranslate(0, -(getTranslateY() + height - mHeight));
        }
        if (getTranslateY() > 0) {
            mMatrix.postTranslate(0, -getTranslateY());
        }
        if (width < mWidth) {
            mMatrix.postTranslate((mWidth - width) / 2, 0);
        }
        if (height < mHeight) {
            mMatrix.postTranslate(0, (mHeight - height) / 2);
        }
        setImageMatrix(mMatrix);
    }

    private float distance(float x0, float x1, float y0, float y1) {
        float x = x0 - x1;
        float y = y0 - y1;
        return FloatMath.sqrt(x * x + y * y);
    }

    private float dispDistance() {
        return FloatMath.sqrt(mWidth * mWidth + mHeight * mHeight);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (mDetector.onTouchEvent(event)) {
            return true;
        }
        int touchCount = event.getPointerCount();
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_1_DOWN:
        case MotionEvent.ACTION_POINTER_2_DOWN:
            if (touchCount >= 2) {
                float distance = distance(event.getX(0), event.getX(1),
                        event.getY(0), event.getY(1));
                mPrevDistance = distance;
                isScaling = true;
            } else {
                mPrevMoveX = (int) event.getX();
                mPrevMoveY = (int) event.getY();
            }
        case MotionEvent.ACTION_MOVE:
            if (touchCount >= 2 && isScaling) {
                float dist = distance(event.getX(0), event.getX(1),
                        event.getY(0), event.getY(1));
                float scale = (dist - mPrevDistance) / dispDistance();
                mPrevDistance = dist;
                scale += 1;
                scale = scale * scale;
                zoomTo(scale, mWidth / 2, mHeight / 2);
                cutting();
            } else if (!isScaling) {
                int distanceX = mPrevMoveX - (int) event.getX();
                int distanceY = mPrevMoveY - (int) event.getY();
                mPrevMoveX = (int) event.getX();
                mPrevMoveY = (int) event.getY();
                mMatrix.postTranslate(-distanceX, -distanceY);
                cutting();
            }
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_POINTER_2_UP:
            if (event.getPointerCount() <= 1) {
                isScaling = false;
            }
            break;
        }
        return true;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return super.onTouchEvent(event);
    }

}

答案 1 :(得分:0)

以这种方式尝试:

img.setOnTouchListener(new OnTouchListener() {          
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                    if (event.getAction() == MotionEvent.ACTION_DOWN)
                    {
                        return true;
                    }
                    if(event.getAction() == MotionEvent.ACTION_MOVE) {
                        RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) img.getLayoutParams();

                        int x = (int) event.getRawX();
                        int y = (int) event.getRawY();

                        mParams.leftMargin = x;
                        mParams.topMargin = y;

                        img.setLayoutParams(mParams);                           
                    }
                return false;
            }
        });

当触发ACTION_DOWN事件时,您需要返回true,以表示您对与该同一事件相关的后续调用感兴趣。

答案 2 :(得分:0)

试试这段代码,

将此代码放在图像setOnTouchListener

img.setOnTouchListener(new View.OnTouchListener() {

                 @Override
                 public boolean onTouch(View v, MotionEvent event) {
                       LayoutParams layoutParams = (LayoutParams) img
                                     .getLayoutParams();
                       switch (event.getAction()) {
                       case MotionEvent.ACTION_DOWN:
                              break;
                       case MotionEvent.ACTION_MOVE:
                              int x_cord = (int) event.getRawX();
                              int y_cord = (int) event.getRawY();

                              if (x_cord > windowwidth) {
                                     x_cord = windowwidth;
                              }
                              if (y_cord > windowheight) {
                                     y_cord = windowheight;
                              }

                              layoutParams.leftMargin = x_cord - 25;
                              layoutParams.topMargin = y_cord - 75;

                              img.setLayoutParams(layoutParams);
                              break;
                       default:
                              break;
                       }
                       return true;
                 }
          });

我希望它能解决你的问题。