android中如何通过手指在屏幕上滑动来动态画出一条直线?

ashelyll 2017-09-12 10:42:39
初来乍到,这个问题之前在技术问答区发过一次,但那里好像不能回复别人的回答,所以还是再发一遍帖子,望大家帮帮忙。
如题,我现在想要实现的效果是,手指在屏幕上滑动时能拖出一条从action down位置到手指当前位置的连线,在手指离开屏幕前,手指变化位置时直线终点跟着改变而起点始终保持为初始action down的位置,从而实现直线跟随手指变化长短和方向的效果,而当手指action up时,就在屏幕上显示action down到action up位置的一条连线。
请教各位熟悉android的朋友,上述效果应该怎么实现?有做过类似效果的帮忙提供一下demo和讲解一下思路吧,感激不尽~
...全文
677 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ashelyll 2017-09-12
  • 打赏
  • 举报
回复
引用 3 楼 qq_28934205 的回复:
把数据保存起来就可以了 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint=new Paint(); paint.setColor(Color.BLACK); paint.setStrokeWidth(5); canvas.drawLine(startX,startY,endX,endY,paint); for (int i = 0; i < list.size(); i++) { float [] data=list.get(i); canvas.drawLine(data[0],data[1],data[2],data[3],paint); } } float startX = 0; float startY = 0; float endX = 0; float endY = 0; ArrayList<float[]> list=new ArrayList<>(); @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = event.getX(); startY = event.getY(); break; case MotionEvent.ACTION_MOVE: endX = event.getX(); endY = event.getY(); invalidate(); break; case MotionEvent.ACTION_UP: float [] data={startX,startY,endX,endY}; list.add(data); break; } return true; }
多谢
魑魅魍魉9527 2017-09-12
  • 打赏
  • 举报
回复 2
把数据保存起来就可以了

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
paint.setColor(Color.BLACK);
paint.setStrokeWidth(5);

canvas.drawLine(startX,startY,endX,endY,paint);
for (int i = 0; i < list.size(); i++) {
float [] data=list.get(i);
canvas.drawLine(data[0],data[1],data[2],data[3],paint);
}
}

float startX = 0;
float startY = 0;

float endX = 0;
float endY = 0;

ArrayList<float[]> list=new ArrayList<>();

@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
endX = event.getX();
endY = event.getY();
invalidate();
break;
case MotionEvent.ACTION_UP:
float [] data={startX,startY,endX,endY};
list.add(data);

break;
}

return true;

}
ashelyll 2017-09-12
  • 打赏
  • 举报
回复
引用 1 楼 qq_28934205 的回复:
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint=new Paint(); paint.setColor(Color.BLACK); paint.setStrokeWidth(5); canvas.drawLine(startX,startY,endX,endY,paint); } float startX = 0; float startY = 0; float endX = 0; float endY = 0; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = event.getX(); startY = event.getY(); break; case MotionEvent.ACTION_MOVE: endX = event.getX(); endY = event.getY(); invalidate(); break; case MotionEvent.ACTION_UP: break; } return true; }
谢谢你,上述代码可以保持直线为跟随状态,看来之前是我想复杂了,顺便追问一下,再次触摸屏幕时,之前的画线就消失了,该怎么保留之前的画线?
魑魅魍魉9527 2017-09-12
  • 打赏
  • 举报
回复
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
paint.setColor(Color.BLACK);
paint.setStrokeWidth(5);

canvas.drawLine(startX,startY,endX,endY,paint);
}

float startX = 0;
float startY = 0;

float endX = 0;
float endY = 0;

@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
endX = event.getX();
endY = event.getY();
invalidate();
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧