我在Android中有一个自定义视图,其中包含onDraw和onTouchEvent方法,我想记录过去2秒内所有触摸的X坐标。我的想法是简单的浮点数组,由motionEvent.getX()填充,但我不知道如何删除“旧”坐标,甚至不知道如何初始化这样的动态数组。
答案 0 :(得分:0)
首先,您要做的是创建一个自定义包装器对象,它将保持触摸X / Y坐标以及坐标的时间戳。一个例子在理论上看起来像这样:
public class TouchRecord {
float x;
float y;
long expiry = -1L;
/**
* Default constructor taht will not set an expiration time.
* @param x
* @param y
*/
public TouchRecord(float x, float y) {
this.x = x;
this.y = y;
}
/**
* Overloaded constructor that will handle setting up the touch record expiration time.
*
* @param x
* @param y
* @param millisToExpiry
*/
public TouchRecord(float x, float y, long recieved, long millisToExpiry) {
this.x = x;
this.y = y;
// Store the time this touch record should be expired based on the current uptime and the
// milliseconds in the touch record is valid.
this.expiry = SystemClock.uptimeMillis() + millisToExpiry;
}
public float getY() {
return y;
}
public float getX() {
return x;
}
public boolean hasExpired() {
// If the expiry value hasn't been set always return false.
return (expiry != -1 ? (SystemClock.uptimeMillis() >= expiry): false);
}
}
然后在自定义视图的onTouchEvent(MotionEvent)内部,监听MotionEvent.ACTION_DOWN操作并创建一个新的TouchRecord obj,并将X,Y和expiration值传入构造函数,并将obj添加到ArrayList中因为它可以根据命令动态调整大小(这是必要的,因为系统可以很快地充斥着十几个触摸事件,并且很难确切地知道你将在2秒内收到多少个)。准备一个处理程序,它将每2秒无限期地执行一次runnable(如果你希望你的触摸记录保持尽可能准确和最新,则更少),它将迭代所有的TouchRecords并删除所有过期的索引。