我正在尝试对一个位于
我已经实现了一个自定义的
ImageView
中的图片进行简单的照片处理,该视图在平均情况下具有200dp
的高度,并与其父视图的宽度匹配。我已经实现了一个自定义的
onTouchListener
类,它创建了一个matrix
并在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;
这个代码裁剪了图片到正确的大小,但仅限于从ImageView
的背景顶部而不是可见边界。通过调用Bitmap
类函数createBitmap(int x, int y, int width, int height)
,我唯一的假设就是view.getTop()
使它从顶部开始。
因此,我的问题是:如何计算可见视图边界和背景/矩阵边界之间的差异?
注意: 图片显示一个位于Activity顶部的图片(蓝色),青色区域只是ImageView
的背景透明边界而不是Activity本身的边界。
我想强调的是,我不希望使用任何第三方库来实现这个功能。
如果需要,我可以提供更多的代码。
更新:
完整的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.getLeft(), view.getTop(), view.getWidth(), 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
}