Android – 拖动和裁剪问题

我正在尝试在 ImageView中活动顶部的图像上进行一些简单的照片处理,它平均具有200dp的高度并匹配其父级的宽度.

我已经实现了一个自定义onTouchListener类,它创建一个矩阵并在ImageView中转换图像

拖动:

case MotionEvent.ACTION_MOVE:
     if (mode == DRAG) {
        matrix.set(savedMatrix);
        matrix.postTranslate(v.getX(),event.getY() - start.y);
     }
     break;

这非常有效,它只在y轴上拖动图像.但是当用户发布时,我希望图像裁剪到可见的ImageView区域的边界.

作物:

case MotionEvent.ACTION_UP:
     if (mode == DRAG) {
        Bitmap bitmap = drawabletoBitmap(view.getDrawable());
        Bitmap result = Bitmap.createBitmap(bitmap,view.getLeft(),view.getTop(),view.getWidth(),view.getHeight());
        view.setimageBitmap(result);
      }
      break;

这会将图像裁剪为正确的大小,但仅从图像视图的背景顶部而不是可见边界.通过调用Bitmap类函数createBitmap(int x,int y,int width,int height),我唯一的假设是view.getTop()使它从顶部开始.

所以,我的问题是:我如何计算可见视图边界的顶部与背景/矩阵边界之间的差异?

注意:图像显示位于活动顶部的图像(蓝色)(青色看区域只是ImageView的背景不可见边界,而不是活动)

我想强调一点,我不希望使用任何第三方库来实现这一目标.

如果需要,我非常愿意提供额外的代码.

更新:

完整的onTouch方法

@Override
public boolean onTouch(View v,MotionEvent event) {
    ImageView view = (ImageView) v;
    // Dump touch event to log
    dumpEvent(event);

    // Handle touch events here...
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            savedMatrix.set(matrix);
            start.set(v.getX(),event.getY());
            mode = DRAG;
            originalY.y = (int) event.getY();
            break;
        case MotionEvent.ACTION_UP:
             if (mode == DRAG) {
        Bitmap bitmap = drawabletoBitmap(view.getDrawable());
        Bitmap result = Bitmap.createBitmap(bitmap,view.getHeight());
        view.setimageBitmap(result);
      }
      break;
        case MotionEvent.ACTION_POINTER_UP:
            mode = NONE;
            break;
        case MotionEvent.ACTION_MOVE:
            if (mode == DRAG) {
                matrix.set(savedMatrix);
                matrix.postTranslate(v.getX(),event.getY() - start.y);
            }
            break;
    }
    view.setimageMatrix(matrix);
    return true; // indicate event was handled
}

解决方法

要计算Activity的根高,我们可以使用
int height = this.getwindow().getDecorView().getHeight();

或者您可以使用显示指标

displayMetrics metrics = context.getResources().getdisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;

或者添加全局布局侦听器

ViewTreeObserver vtObserver = view.getViewTreeObserver();
vtObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
    // check if the view's height and/or width > 0
    // don't forget to remove the listener when done using removeOnGlobalLayoutListener
}

});

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...