要用到surfaceview,在实现手指缩放和拖拽时出现了问题。可拖拽了缩放有问题,可缩放了,拖拽有问题。
请哪位好心的大侠给一段范例脚本,学习一下,万分感激。

解决方案 »

  1.   

    换个问题,scale后,再拖动,dest = new Rect(left, top, right, bottom) 这个right和bottom值如何获得
      

  2.   

    package com.example.draw;import android.app.Activity;
    import android.content.Context;
    import android.content.res.Configuration;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.os.Bundle;
    import android.view.GestureDetector;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;public class MainActivity extends Activity {
    /** Called when the activity is first created. */ private SurfaceView videoView;
    private SurfaceHolder sfh;
    private Canvas canvas;
    private Paint paint;
    private boolean flag = true;
    private Bitmap bmpIcon;
    private int x1, x2, y1, y2;
    private float rate = 1;
    private float oldRate = 1;
    private float oldLineDistance;
    private boolean isFirst = true;
    private MySurfaceView mySurfaceView; private GestureDetector mGestureDetector;
    private float scale = 1f; // 缩放比例,默认为1
    Rect src = null;
    Rect dest = null;
    private int bmpWidth;
    private int bmpHeight;
    private int scrWidth;
    private int scrHeight;
    private int xOffset;
    private int yOffset;
    private int xAfterDrag = 0;
    private int yAfterDrag = 0;
    private int xBeforeDrag = 0;
    private int yBeforeDrag = 0;
    private int xDest;
    private int yDest;
    private int hDest;
    private int wDest;
    private boolean isDrag = false;
    private int curWidth;
    private int curHeight;
    private float baseValue; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new MySurfaceView(this));
    videoView = (SurfaceView) findViewById(R.id.videoView); bmpIcon = BitmapFactory.decodeResource(this.getResources(),
    R.drawable.mmm);
    bmpWidth = bmpIcon.getWidth();
    bmpHeight = bmpIcon.getHeight();
    paint = new Paint();
    } class MySurfaceView extends SurfaceView implements Callback { public MySurfaceView(Context context) {
    super(context);
    sfh = this.getHolder();
    sfh.addCallback(this); } @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
    // TODO Auto-generated method stub } @Override
    public void surfaceCreated(SurfaceHolder holder) {
    src = new Rect(0, 0, bmpWidth, bmpHeight);
    scrWidth = this.getWidth();
    scrHeight = this.getHeight(); // 以下是以屏幕大小显示全图片
    curWidth = scrWidth;
    curHeight = scrHeight;
    xDest = 0;// (scrWidth - bmpWidth) / 2;
    yDest = 0;// (scrHeight - bmpHeight) / 2; // 以下是以图片原始大小显示
    curWidth = bmpWidth;
    curHeight = bmpHeight;
    xDest = (scrWidth - bmpWidth) / 2;
    yDest = (scrHeight - bmpHeight) / 2; wDest = curWidth + xDest;
    hDest = curHeight + yDest;
    dest = new Rect(xDest, yDest, wDest, hDest); new ImageThread().start();
    } @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    }
    } @Override
    public boolean onTouchEvent(MotionEvent event) {
    int pointerCount = event.getPointerCount();
    int pointerId = 0;
    int action = (event.getAction() & MotionEvent.ACTION_MASK) % 5;// 统一单点和多点
    switch (action) {
    case MotionEvent.ACTION_DOWN:
    baseValue = 0;
    case MotionEvent.ACTION_MOVE:
    if (event.getPointerCount() == 1) {
    drag(event);
    } else if (event.getPointerCount() == 2) {
    x1 = (int) event.getX(0);
    y1 = (int) event.getY(0);
    x2 = (int) event.getX(1);
    y2 = (int) event.getY(1);
    float x = event.getX(0) - event.getX(1);
    float y = event.getY(0) - event.getY(1);
    float value = (float) Math.sqrt(x * x + y * y);// 计算两点的距离
    if (baseValue == 0) {
    baseValue = value;
    } else {
    rate = value / baseValue;
    rate = (rate < 1f ? 1f : rate);
    }
    }
    }
    return true;
    } @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    return super.onKeyDown(keyCode, event);
    } class ImageThread extends Thread {
    @Override
    public void run() {
    while (flag) {
    long start = System.currentTimeMillis();
    myDraw();
    long end = System.currentTimeMillis();
    try {
    if (end - start < 50) {
    Thread.sleep(50 - (end - start));
    }
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    } private void drag(MotionEvent event) {
    // rate = 1f;
    if (event.getPointerCount() == 1) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
    xBeforeDrag = Math.round(event.getX());
    yBeforeDrag = Math.round(event.getY());
    } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
    xAfterDrag = Math.round(event.getX());
    yAfterDrag = Math.round(event.getY()); xOffset = xAfterDrag - xBeforeDrag;
    yOffset = yAfterDrag - yBeforeDrag; xBeforeDrag = xAfterDrag;
    yBeforeDrag = yAfterDrag; // 计算需要绘制的区域
    xDest += xOffset;
    yDest += yOffset; // 绘制时,上边界应该是<=0的值,如果大于0了,则上面出黑边了
    xDest = (xDest > 0 ? 0 : xDest);
    yDest = (yDest > 0 ? 0 : yDest); // 如果左上坐标小于屏幕的宽度减去目标画布的宽度,则下边出黑边了
    if (xDest < 0) {
    xDest = (xDest < scrWidth - curWidth ? scrWidth - curWidth
    : xDest);
    wDest = curWidth + xDest;
    } if (yDest < 0) {
    yDest = (yDest < scrHeight - curHeight ? scrHeight
    - curHeight : yDest);
    hDest = curHeight + yDest;
    } dest = new Rect(xDest, yDest, wDest, hDest);
    isDrag = true;
    }
    } } public void myDraw() {
    try {
    canvas = sfh.lockCanvas();
    if (canvas != null) {
    canvas.drawColor(Color.BLACK);
    canvas.save();
    canvas.scale(rate, rate, scrWidth / 2, scrHeight / 2);
    canvas.drawBitmap(bmpIcon, src, dest, paint);
    canvas.drawLine(x1, y1, x2, y2, paint);
    canvas.restore();
    sfh.unlockCanvasAndPost(canvas);
    }
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    }
    } @Override
    public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    }
    }
      

  3.   

    缩放是用的scale,图片放大后,需要拖动显示,而拖动是自己写的,计算dest区域,dest = new Rect(left, top, right, bottom) 这个right和bottom值如何获得 
      

  4.   

    此外,另个手指放上去后,就会触发灵敏的ontouch,导致缩放比例rate总有细微的变化,请问,这里如何控制