我想要的是用OnTouchListener通过 coords (X,Y)来显示Bitmap的一部分(橙色正方形,中心有点)。
所以问题是我想绘制图像上显示的部分图像(红色方块“我想要的区域”来显示)。
所以在这种情况下,例外结果是(位图的一部分):
目前我正是这样做的:
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
Bitmap mBitmap = Bitmap.createBitmap(sourceBitmap,view.getX() - view.getWidth(),view.getY()-view.getHeight(),250,250);
//other stuff to fill this portion of bitmap
break;
}
return true;
}
}
这不正确。
我怎样才能做到这一点? 尝试了很多公式,但没有运气。有什么建议?
PS据我所知 event.getX() / event.getY()正在获得相对协调(对我而言,不清楚是什么coords从对象得到的带触摸监听器的图像视图(带有中心点的橙色方块),我的意思是它获得此对象的中心或 Top.Left 角(X,Y))?
答案 0 :(得分:0)
很抱歉,在查看解决方案的更多细节时,我想我找到了它并且我在工作,所以你可以试试这个:
使用event.getX()
而不是view.getX()
。 view.getX()
返回您正在触摸的视图的位置,而不是您感兴趣的触摸事件。
这是可能会反转的Y坐标。
所以event.getX()
是触摸事件的位置。
event.getY()
是倒Y位置,因此getHeight() - event.getY()
将为您提供您所追求的Y位置。
编辑
在MOTION_MOVE的情况下,getX和getY返回最新的并维护历史数据。我猜最新的一个是最有价值的,因为那是你将要画的地方。
在这种情况下,请使用文档中的批处理引用:
批处理 - http://developer.android.com/reference/android/view/MotionEvent.html
为了提高效率,使用ACTION_MOVE的动作事件可以一起批量处理 单个对象内的多个移动样本。最新的 使用getX(int)和getY(int)可以获得指针坐标。 使用批次访问批次中的早期坐标 getHistoricalX(int,int)和getHistoricalY(int,int)。该坐标 只有当它们比现在更古老时才是“历史的” 批次中的坐标;然而,它们仍然与众不同 先前运动事件中报告的其他坐标。处理所有 按时间顺序坐标,首先消耗历史 坐标然后消耗当前坐标。
答案 1 :(得分:0)
你必须得到这样的坐标,它会给你坐标参考,而不是屏幕。
float xCord = event.getRawX()-v.getX();
float yCord = event.getRawY()-v.getY();
答案 2 :(得分:0)
因此解决这个问题很简单
的解决方案强>:
我有一个带OnTouchListener的对象(橙色正方形)(例如,他是一个尺寸为50dp 高度 / 50dp 宽度的四边形)。
所以 view.getX()/ view.getY()获取对象的相对坐标(中心)(具有OnTouchListener)。
所以我需要的是:
//imageview parameters ,where i will show this part of bitmap
int Width = img.getWidth();
int Height = img.getHeight();
//after this,i make margin of my coords,via this simple formula -> Current Coord X - Width / 2 (same for Y)
Bitmap mBitmap = Bitmap.createBitmap(sourceBitmap,view.getX() - Width / 2,view.getY()-Height / 2,Width,Height);
就是这样 享受!
答案 3 :(得分:0)
遗憾的是,如果您想在视图范围内真正解决该事件,则没有简单的解决方法。在某些硬件上的Android Pie上仍然会发生这种情况。解决奇数触摸事件的唯一方法是,如果在ACTION_MOVE期间没有奇异动作,则比较最后3个事件,然后再放置视图位置。以下是在圆形视图上检查事件的示例。假设您创建了一个新double [3] 临时变量:
/**
* This detects if your finger movement is a result of an actual raw touch event of if it's from a view jitter.
* This uses 3 events of rotation as temporary storage so that differentiation between swapping touch events can be determined.
*
* @param newRotationValue
*/
private boolean isRotationTouchEventConsistent(final double newRotationValue) {
double evalValue = newRotationValue;
if (Double.compare(newRotationStore[2], newRotationStore[1]) != 0) {
newRotationStore[2] = newRotationStore[1];
}
if (Double.compare(newRotationStore[1], newRotationStore[0]) != 0) {
newRotationStore[1] = newRotationStore[0];
}
newRotationStore[0] = evalValue;
if (Double.compare(newRotationStore[2], newRotationStore[0]) == 0
|| Double.compare(newRotationStore[1], newRotationStore[0]) == 0
|| Double.compare(newRotationStore[2], newRotationStore[1]) == 0
//Is the middle event the odd one out
|| (newRotationStore[0] > newRotationStore[1] && newRotationStore[1] < newRotationStore[2])
|| (newRotationStore[0] < newRotationStore[1] && newRotationStore[1] > newRotationStore[2])
) {
return false;
}
return true;
}