Android - 使用 onTouch 获取所拍照片的一部分

Android - get a section of a taken picture with onTouch

我正在开发一个应用程序,用户可以在其中使用相机拍摄照片,然后应该能够拖动图像的一部分以进行进一步分析。 所选部分应该以某种方式显示(我正在尝试使用 Rect)。 activity 如下:

public class PictureChopActivity extends Activity {

private static final String TAG = "PictureChopActivity";

ImageView taken;
Bitmap bm = CameraActivity.bm;
Bitmap tempBitmap;
Canvas tempCanvas;
//just to check...
private static float left_test = 200, top_test = 200, right_test = 500, bottom_test = 500;
private static float left, top, right, bottom;
Paint myPaint = new Paint();

private View.OnTouchListener sTouchListener = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        Log.d(TAG, "onTouch called");

        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:

                left = event.getX();
                right = event.getX();
                top = event.getY();
                bottom = event.getY();

                Log.d(TAG, "ACTION_DOWN");

                break;

            case MotionEvent.ACTION_MOVE:

                if (event.getX() > left && event.getY() > bottom) {          //derecha arriba
                    right = event.getX();
                    top = event.getY();
                } else if (event.getX() > left && event.getY() < top) {      //derecha abajo
                    right = event.getX();
                    bottom = event.getY();
                } else if (event.getX() < right && event.getY() > bottom) {  //izquierda arriba
                    left = event.getX();
                    top = event.getY();
                } else if (event.getX() < right && event.getY() < top) {     //izquierda abajo
                    left = event.getX();
                    bottom = event.getY();
                }

                Log.d(TAG, "ACTION_MOVE");
                Log.d(TAG, "left = " + left);
                Log.d(TAG, "top = " + top);
                Log.d(TAG, "right = " + right);
                Log.d(TAG, "bottom = " + bottom);


                break;

            case MotionEvent.ACTION_CANCEL:

                Log.d(TAG, "ACTION_CANCEL");

                break;

            case MotionEvent.ACTION_UP:

                Log.d(TAG, "ACTION_UP");

                break;

        }

        tempCanvas.drawRoundRect(new RectF(left, top, right, bottom), 2, 2, myPaint);
        taken.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap));

        return true;
    }

};




@Override
public void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (myPaint == null) {
        Log.d(TAG, "myPaint is null!");
    }

    //Just to check...
    tempBitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Bitmap.Config.ARGB_8888);
    tempCanvas = new Canvas(tempBitmap);
    tempCanvas.drawBitmap(bm, 0, 0, null);
    tempCanvas.drawRoundRect(new RectF(left_test, top_test, right_test, bottom_test), 2, 2, myPaint);
    //here a rect is drawn!!


    FrameLayout fl = new FrameLayout(this);

    taken = new ImageView(this);
    taken.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap));
    taken.setOnTouchListener(sTouchListener);
    fl.addView(taken);


    this.setContentView(fl);

}

}

当我拍照并触摸屏幕时,没有出现矩形。

这段代码有什么问题吗?我应该尝试不同的方法吗?

编辑:我创建了一个测试矩形,最初绘制成功。

Logcat:

12-12 20:26:19.133 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.133 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_DOWN
12-12 20:26:19.143 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.143 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.143 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1506.0
12-12 20:26:19.143 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.143 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.143 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 666.0
12-12 20:26:19.163 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.163 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.163 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1506.0
12-12 20:26:19.163 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.163 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.163 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 666.0
12-12 20:26:19.173 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.173 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.173 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1506.0
12-12 20:26:19.173 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.173 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.173 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 666.0
12-12 20:26:19.193 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.193 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.193 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1506.0
12-12 20:26:19.193 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.193 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.193 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 666.0
12-12 20:26:19.213 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.213 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.213 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1506.0
12-12 20:26:19.213 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.213 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.213 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 666.0
12-12 20:26:19.223 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.223 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.223 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1497.2212
12-12 20:26:19.223 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.223 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.223 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 665.22125
12-12 20:26:19.243 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.243 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.243 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1494.1829
12-12 20:26:19.243 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.243 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.243 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 665.0
12-12 20:26:19.263 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.263 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.263 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1491.1027
12-12 20:26:19.263 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.263 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.263 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 664.0
12-12 20:26:19.283 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.283 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.283 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1486.6072
12-12 20:26:19.283 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.283 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.283 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 664.0
12-12 20:26:19.293 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.293 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.293 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1483.0435
12-12 20:26:19.293 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.293 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.293 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 664.0
12-12 20:26:19.313 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.313 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.313 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1480.0131
12-12 20:26:19.313 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.313 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.313 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 664.0
12-12 20:26:19.333 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.333 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.333 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1476.9796
12-12 20:26:19.333 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.333 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.333 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 664.0
12-12 20:26:19.343 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.343 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.343 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1473.9349
12-12 20:26:19.343 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.343 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.343 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 664.0
12-12 20:26:19.363 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.363 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.363 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1470.8989
12-12 20:26:19.363 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.363 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.363 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 664.0
12-12 20:26:19.383 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.383 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.383 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1466.3025
12-12 20:26:19.383 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.383 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.383 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 663.0
12-12 20:26:19.393 25944-25944/fogames.thecolourapp D/PictureChopActivity: onTouch called
12-12 20:26:19.393 25944-25944/fogames.thecolourapp D/PictureChopActivity: ACTION_MOVE
12-12 20:26:19.393 25944-25944/fogames.thecolourapp D/PictureChopActivity: left = 1461.7457
12-12 20:26:19.393 25944-25944/fogames.thecolourapp D/PictureChopActivity: top = 666.0
12-12 20:26:19.393 25944-25944/fogames.thecolourapp D/PictureChopActivity: right = 1506.0
12-12 20:26:19.393 25944-25944/fogames.thecolourapp D/PictureChopActivity: bottom = 663.0

topright 值是恒定的。 ACTION_DOWN应该存储第一个角和ACTION_MOVE对面的角,但结果不如预期。

终于找到错误了,很简单!

我假设Y轴的方向是错误的:实际上是top < bottom,所以必须改变条件:

if (event.getX() > left && event.getY() < bottom) {          //extend right up
                    right = event.getX();
                    top = event.getY();
                } else if (event.getX() > left && event.getY() > top) {      //extend right down
                    right = event.getX();
                    bottom = event.getY();
                } else if (event.getX() < right && event.getY() < bottom) {  //extend left up
                    left = event.getX();
                    top = event.getY();
                } else if (event.getX() < right && event.getY() > top) {     //extend left down
                    left = event.getX();
                    bottom = event.getY();
                }