如何使用OnTouchListener获取Object的正确coords(event.getX()/ event.getY())

时间:2015-12-03 09:47:23

标签: android bitmap coordinates ontouchlistener magnify

我有这个:
source case

我想要的是用OnTouchListener通过 coords (X,Y)来显示Bitmap的一部分(橙色正方形,中心有点)。

所以问题是我想绘制图像上显示的部分图像(红色方块“我想要的区域”来显示)。
所以在这种情况下,例外结果是(位图的一部分):
excepted result
目前我正是这样做的:

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))?

4 个答案:

答案 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;
    }