我有一个自定义布局,可以根据触摸输入画一条线。我让它画了线,但是当用户触摸屏幕时,线消失了,它画了一条新线。我想要它做的是画一条新线并将上一条线留在那里。 这是我的代码:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class DrawView extends View {
Paint paint = new Paint();
float startX;
float startY;
float stopX;
float stopY;
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setAntiAlias(true);
paint.setStrokeWidth(6f);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawLine(startX, startY, stopX, stopY, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
return true;
case MotionEvent.ACTION_MOVE:
stopX = event.getX();
stopY = event.getY();
break;
case MotionEvent.ACTION_UP:
stopX = event.getX();
stopY = event.getY();
break;
default:
return false;
}
Invalidate();
return true;
}
}
最佳答案
你需要存储所有行而不是最后一行。
以下代码完全未经测试,但希望能为您提供大致思路。
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
class Line {
float startX, startY, stopX, stopY;
public Line(float startX, float startY, float stopX, float stopY) {
this.startX = startX;
this.startY = startY;
this.stopX = stopX;
this.stopY = stopY;
}
public Line(float startX, float startY) { // for convenience
this(startX, startY, startX, startY);
}
}
public class DrawView extends View {
Paint paint = new Paint();
ArrayList<Line> lines = new ArrayList<Line>();
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setAntiAlias(true);
paint.setStrokeWidth(6f);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
}
@Override
protected void onDraw(Canvas canvas) {
for (Line l : lines) {
canvas.drawLine(l.startX, l.startY, l.stopX, l.stopY, paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
lines.add(new Line(event.getX(), event.getY()));
return true;
}
else if ((event.getAction() == MotionEvent.ACTION_MOVE ||
event.getAction() == MotionEvent.ACTION_UP) &&
lines.size() > 0) {
Line current = lines.get(lines.size() - 1);
current.stopX = event.getX();
current.stopY = event.getY();
invalidate();
return true;
}
else {
return false;
}
}
}
关于Android Canvas 画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16748146/
我正在看这个fiddle:http://jsfiddle.net/kDs2Q/45/有没有办法以某种方式对div/行进行分层,以便该行位于其他div的后面?我希望能够从一个div的中心到另一个div的中心绘制一条线,但看不到该线穿过实际的框。这就是我对中心到中心的看法:varoff1=getOffset(div1);varoff2=getOffset(div2);varx1=off1.left+off1.width/2;vary1=off1.top+off1.height/2;varx2=off2.left+off1.width/2;vary2=off2.top+off1.height
我正在使用KinectJS根据鼠标移动绘制线条。当用户按住鼠标按钮时,我希望它成为线条的“起点”,当用户释放时,它将成为线条的“终点”,但是当他们按住鼠标时我想要能够在我的鼠标移动时动态重绘线条。这可能吗? 最佳答案 是的,这是可能的。基本上,您必须在onMouseMove事件期间重绘图层。您需要一个标志来控制线路何时移动。当脚本初始化时,这个标志应该是假的。在onMouseDown时,行开始应接收当前鼠标坐标并将标志设置为true。在onMouseMouve中,如果标志为真,您应该更新行尾以接收当前鼠标坐标。在onMouseUp时
我正在尝试绘制三个圆圈并在每个圆圈之间绘制连接线。最终目标是使用json配置配置连接哪些圈子,但在此之前我只是尝试使用回调和硬代码值连接圈子。这是我目前所拥有的:vargraph={"nodes":[{"name":"1","group":1,"x":100,"y":100,r:20},{"name":"2","group":1,"x":200,"y":150,r:30},{"name":"3","group":2,"x":300,"y":250,r:50}],"links":[{"source":1,"target":0,"value":1}]}varwidth=2000;varhe
我对it有同样的疑问当在yAxis中使用相同的值时,底部的绘图线这是我的代码:vardata=[{creat_time:"2013-03-1910:28:30",roundTripTime:"32"},{creat_time:"2013-03-1909:07:12",roundTripTime:"45"},{creat_time:"2013-03-1908:57:09",roundTripTime:"26"},{creat_time:"2013-03-1908:47:10",roundTripTime:"90"},{creat_time:"2013-03-1908:37:12",rou
我想制作一个应用程序,让球按照鼠标击中它的Angular移动。因此,如果您从左上象限以30度Angular向下滑动鼠标(我猜那将是180-30=150度Angular),它会以这种方式击球。我一直在这样画我的线条:functiondrawAngles(){vard=50;//startlineat(10,20),move50pxawayatangleof30degreesvarangle=80*Math.PI/180;ctx.beginPath();ctx.moveTo(300,0);ctx.lineTo(300,600);//x,yctx.moveTo(0,300);ctx.line
我想在VisualC++FormsPictureBox中画黑线来绘制一些信息。我应该怎么做?可以使用PictureBox来执行此操作,还是应该使用其他东西来代替? 最佳答案 要在任何WinForms控件上绘制,请处理Paint事件,获取Graphics对象,然后调用DrawLine或othermethods随心所欲。MSDN上有一个很好的例子. 关于windows-如何在VisualC++PictureBox中画线,我们在StackOverflow上找到一个类似的问题:
我想在静态控件中画一条线:caseWM_CREATE:{hgraph=CreateWindow(WC_STATIC,NULL,WS_CHILD|WS_VISIBLE|SS_CENTER,20,20,660,80,hWnd,NULL,NULL,NULL);SendMessage(hgraph,WM_SETTEXT,NULL,(LPARAM)"MyStatic");break;}caseWM_PAINT:{hdc=GetDC(hgraph);hp=CreatePen(0,5,RGB(0,100,0));SelectObject(hdc,hp);MoveToEx(hdc,0,0,0);Lin
我正在使用itextsharp在asp.netc#中生成一个pdf文件。我无法绘制水平线/垂直线/虚线。我尝试使用以下代码绘制一条线,我没有收到任何错误,但该线也没有显示在pdf文件中PdfContentBytecb=wri.DirectContent;cb.SetLineWidth(2.0f);//Makeabitthickerthan1.0defaultcb.MoveTo(20,pdfDocument.Top-40f);cb.LineTo(400,pdfDocument.Top-40f);cb.Stroke();代码有什么问题,是不是因为xy坐标的位置?我曾使用粗略的点来了解pdf
我想在bmp图像上画一条线,该图像传递给C#中使用drawline方法的方法publicvoidDrawLineInt(Bitmapbmp){PenblackPen=newPen(Color.Black,3);intx1=100;inty1=100;intx2=500;inty2=100;//Drawlinetoscreen.e.Graphics.DrawLine(blackPen,x1,y1,x2,y2);}这会出错。所以我想知道如何在此处包含绘画事件(PaintEventArgse)也想知道调用drawmethod时如何传递参数?例子DrawLineInt(Bitmapbmp);这
我是c#的新手,我正在努力在表格中画一条线。这是我到目前为止的代码。Graphicsg;g=this.CreateGraphics();PenmyPen=newPen(Color.Red);myPen.Width=30;g.DrawLine(myPen,30,30,45,65);g.DrawLine(myPen,1,1,45,65); 最佳答案 在OnPaint中尝试一下protectedoverridevoidOnPaint(PaintEventArgse){base.OnPaint(e);Graphicsg;g=e.Graphi