我想要一个位图跟随我的手指。但是当我使用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);
}
答案 0 :(得分:0)
您必须对onTouch
方法执行一些不必要的工作。因为如果你只改变它的位置,它不应该是滞后的。
编辑:
您可以保存Rect
m_Src和m_Dst,只需更改渲染中的坐标即可。
这将为系统和垃圾收集节省大量工作。
答案 1 :(得分: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);
}
这里每次分配2个Rect
个对象。您应该只初始化一次并使用Rect.set
更改其值。
此外,如果您的Bitmap
尺寸不应更改,则可以使用public void drawBitmap (Bitmap bitmap, float left, float top, Paint paint)
,因为此方法不会对Bitmap
执行任何缩放/翻译,并且应该更有效。
答案 2 :(得分:0)
我的猜测是每次绘图时“onTouch”处理程序都会中断......
你的“onDraw”例程应该位于正确的线程中(也许ASyncTask也可以完成这项工作)。然后,您必须将手指的x,y坐标转发到gui线程。
在google中输入“Thread Gui Android”作为综合示例:)