最近在学习链表结构,感觉保存轨迹用链表结构比较合适(注意可能会导致栈溢出),顺手写了个Android划线测试自定义View,类似开发者选项中的显示指针,用于出厂检测
不多说下面贴代码
/**
* @author OneT1me
*/
public class DrawLineTest extends Activity {
WindowManager windowManager;
int width, height;
int textSize = 40;
public final String TAG = "" + this.getClass().getName();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(new DrawLineView(this, null));
windowManager = getWindowManager();
width = windowManager.getDefaultDisplay().getWidth();
height = windowManager.getDefaultDisplay().getHeight();
}
/**
* this view to do draw test
* you should be @see setContentView(new DrawLineView(Context mContext, null))
*/
class DrawLineView extends View {
PositionTable originPositionTable = new PositionTable();
PositionTable tmpPositionTable = new PositionTable();
Paint linePaint = new Paint();
Paint textpaint = new Paint();
public DrawLineView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
linePaint.setColor(Color.RED);
textpaint.setTextSize(textSize);
textpaint.setColor(Color.BLUE);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
PositionTable p = originPositionTable;
if (p == null) {
p = new PositionTable();
}
while (p.next != null && p.next.next != null) {
Log.i(TAG, "x = " + p.x + ", y = " + p.y);
canvas.drawLine(p.x, p.y, p.next.x, p.next.y, linePaint);
p = p.next;
}
canvas.drawText("x = " + p.x + ", y = " + p.y, 0, textSize, textpaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
originPositionTable = null;//GC
originPositionTable = new PositionTable();
originPositionTable.x = event.getX();
originPositionTable.y = event.getY();
originPositionTable.next = tmpPositionTable;
return true;
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
tmpPositionTable.x = event.getX();
tmpPositionTable.y = event.getY();
tmpPositionTable.next = new PositionTable();
tmpPositionTable = tmpPositionTable.next;
invalidate();
}
if (event.getAction() == MotionEvent.ACTION_UP) {
}
return super.onTouchEvent(event);
}
class PositionTable {//内部类,用于保存坐标,链表结构
float x;
float y;
PositionTable next;
}
}
}
效果图