0

我想要一个位图跟随我的手指。但是当我使用 MotionEvent.ACTION_MOVE 时,位图会落后。有没有办法让位图立即(或几乎立即)跟随您的手指?

    public boolean onTouch(View v, MotionEvent me) 
{   
    // TODO Auto-generated method stub
    switch(me.getAction())
    {
    case MotionEvent.ACTION_DOWN:
        if(me.getX() > player.get_RectXPos() && me.getX() < player.get_RectXPos() + player.get_Width() && 
           me.getY() > player.get_RectYPos() && me.getY() < player.get_RectYPos() + player.get_Height())
        {
            isDown = true;
        }
        break;
    case MotionEvent.ACTION_UP:
        isDown = false;
        break;
    case MotionEvent.ACTION_MOVE:
        if(isDown == true)
        {
            player.set_xPos(me.getX());
            player.set_yPos(me.getY());
        }

        break;
    }
    return true;
}

我想你要求这部分:

    void render(Canvas canvas)
{
    m_Src = new Rect(0, 0, m_RectWidth, m_RectHeight);
    m_Dst = new Rect(m_RectX, m_RectY, m_RectX + m_RectWidth, m_RectY + m_RectHeight);
    canvas.drawBitmap(m_Bitmap, m_Src, m_Dst, null);
}
4

3 回答 3

0

你必须对你的onTouch方法做一些不必要的工作。因为如果你只改变它的位置,它不应该是滞后的。

编辑:您可以保存您的Rectm_Src 和 m_Dst 并在渲染中更改它们的坐标。这将为系统和垃圾收集节省大量工作。

于 2014-02-11T16:05:05.943 回答
0
void render(Canvas canvas)
{
m_Src = new Rect(0, 0, m_RectWidth, m_RectHeight);
m_Dst = new Rect(m_RectX, m_RectY, m_RectX + m_RectWidth, m_RectY + m_RectHeight);
canvas.drawBitmap(m_Bitmap, m_Src, m_Dst, null);
}

Rect在这里,您每次分配 2 个对象。您应该只初始化它们一次并使用它Rect.set来更改它们的值。

此外,如果您的Bitmap尺寸不应该改变,您可以使用,public void drawBitmap (Bitmap bitmap, float left, float top, Paint paint)因为此方法不会对 进行任何缩放/转换,Bitmap并且应该更有效。

于 2014-02-11T16:36:59.897 回答
0

我的猜测是每次绘图时“onTouch”处理程序都会中断......

您的“onDraw”例程应该位于其正确的线程中(也许 ASyncTask 也可以完成这项工作)。然后,您必须将手指的 x,y 坐标转发到 gui 线程。

在谷歌中输入“Thread Gui Android”以获得一个综合示例:)

于 2014-02-11T16:40:03.737 回答