我正在尝试在
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 }
});