我正在尝试在一个activity内部顶部的图像上进行一些简单的照片处理ImageView,它平均有一个200dp高度并与其父级的宽度相匹配.
我已经实现了一个自定义onTouchListener类,它创建matrix并转换图像ImageView
拖动:
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(v.getX(), event.getY() - start.y);
}
break;
Run Code Online (Sandbox Code Playgroud)
这非常有效,它只在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;
Run Code Online (Sandbox Code Playgroud)
这会将图像裁剪为正确的大小,但仅从图像视图的背景顶部而不是可见边界.通过调用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.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
}
Run Code Online (Sandbox Code Playgroud)
小智 0
要计算 Activity 的根高度,我们可以使用
int height = this.getWindow().getDecorView().getHeight();
Run Code Online (Sandbox Code Playgroud)
或者您可以使用显示指标
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;
Run Code Online (Sandbox Code Playgroud)
或者添加一个全局布局监听器
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
}
Run Code Online (Sandbox Code Playgroud)
});
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |