Android 如何使用画布绘制不同图案的线条?
嘿,我想用画布画一条不同图案的线 任何想法或建议都将不胜感激 提前感谢。您必须使用。文档说明: Path类封装复合(多轮廓)几何图形 由直线段、二次曲线和 三次曲线 例如,您可以扩展视图的Android 如何使用画布绘制不同图案的线条?,android,android-canvas,Android,Android Canvas,嘿,我想用画布画一条不同图案的线 任何想法或建议都将不胜感激 提前感谢。您必须使用。文档说明: Path类封装复合(多轮廓)几何图形 由直线段、二次曲线和 三次曲线 例如,您可以扩展视图的并将触摸事件位置添加到视图的onTouchEvent(MotionEvent)方法中的路径中。然后您必须生成与最新触摸事件相对应的随机位置,并将其添加到路径的其他实例中。最后,在视图的onDraw()方法中,绘制所有路径。我希望这段代码可以帮助您理解我的想法: public class NetCanvas ex
并将触摸事件位置添加到视图的onTouchEvent(MotionEvent)
方法中的路径中。然后您必须生成与最新触摸事件相对应的随机位置,并将其添加到路径的其他实例中。最后,在视图的onDraw()
方法中,绘制所有路径。我希望这段代码可以帮助您理解我的想法:
public class NetCanvas extends View {
private static final double MAX_DIFF = 15;
Path path0 = new Path();
Path path = new Path();
private Paint p0;
private Paint p;
public NetCanvas(Context context) {
super(context);
p0 = new Paint();
p0.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.GREEN,
Color.RED, Shader.TileMode.CLAMP));
p0.setStyle(Style.STROKE);
p = new Paint();
p.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.BLUE,
Color.MAGENTA, Shader.TileMode.CLAMP));
p.setStyle(Style.STROKE);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x0 = event.getX();
float y0 = event.getY();
float x = generateFloat(event.getX());
float y = generateFloat(event.getY());
if (event.getAction() == MotionEvent.ACTION_DOWN) {
path0.moveTo(x0, y0);
path0.lineTo(x0, y0);
path.moveTo(x, y);
path.lineTo(x, y);
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
path0.lineTo(x0, y0);
path.lineTo(x, y);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
path0.lineTo(x0, y0);
path.lineTo(x, y);
}
invalidate();
return true;
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawPath(path0, p0);
canvas.drawPath(path, p);
}
private float generateFloat(Float f){
double d = (Math.signum(2*Math.random() - 1)) * Math.random() * MAX_DIFF;
return (float) (f + d);
}
}
在上面的代码中,我使用了两个路径
s,但您可以使用三个或更多路径。结果也取决于您在屏幕上的手指频率。例如:
或者看起来像这样:
编辑:
上面的类(NetCanvas
)扩展了View
,因此您可以创建它的一个实例,并像其他视图一样使用该实例。例如,您可以简单地将它的一个实例设置为活动的ContentView
。这里我重写了活动的onCreate()
方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new NetCanvas(this));
}
尽管您可以更改NetCanvas
以扩展SurfaceView
,但也可以进行一些其他更改。我更改了NetCanvas
以绘制一个形状,看起来像您问题中的第二个图像:
public class NetCanvas1 extends View {
Path path0 = new Path();
private Paint p0;
private int points_Num = 20;
private int first_Points_Num = 5;
public NetCanvas1(Context context) {
super(context);
p0 = new Paint();
p0.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.GREEN,
Color.RED, Shader.TileMode.CLAMP));
p0.setStyle(Style.STROKE);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x0 = event.getX();
float y0 = event.getY();
if (event.getAction() == MotionEvent.ACTION_DOWN) {
path0.moveTo(x0, y0);
path0.lineTo(x0, y0);
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
path0.lineTo(x0, y0);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
path0.lineTo(x0, y0);
invalidate();
}
return true;
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawPath(path0, p0);
FlaotPoint[] pointArray = getPoints();
try {
for (int i = 0; i < first_Points_Num; i++) {
for (int j = i; j < pointArray.length; j++) {
canvas.drawLine(pointArray[i].getX(), pointArray[i].getY(),
pointArray[j].getX(), pointArray[j].getY(), p0);
}
}
path0.reset();
} catch (Exception e) {
}
}
private FlaotPoint[] getPoints() {
FlaotPoint[] pointArray = new FlaotPoint[points_Num];
PathMeasure pm = new PathMeasure(path0, false);
float length = pm.getLength();
float distance = 0f;
float speed = length / points_Num;
int counter = 0;
float[] aCoordinates = new float[2];
while ((distance < length) && (counter < points_Num)) {
// get point from the path
pm.getPosTan(distance, aCoordinates, null);
pointArray[counter] = new FlaotPoint(aCoordinates[0],
aCoordinates[1]);
counter++;
distance = distance + speed;
}
return pointArray;
}
class FlaotPoint {
float x, y;
public FlaotPoint(float x, float y) {
this.x = x;
this.y = y;
}
public float getX() {
return x;
}
public float getY() {
return y;
}
}
}
您可以更改每个变量的值或点的顺序来更改结果。结果可能如下所示:
我的想法很简单:从路径获取点,并用线连接它们。如果您想了解有关从路径获取点的更多详细信息,请使用getPoints()
方法,你可以看到及其参考资料。我希望这对你有所帮助。这里的模式是什么意思?你能发布应用程序的链接吗?只是想了解你所说的网络模式是什么意思?好的。因此,如果你有任何与此相关的想法,请与我分享。这一个可以帮助你。请参阅@mpp的我的答案,请查看我的编辑。@mpp我添加了另一个答案,请查看。我希望它对您有所帮助。这是一个很好的示例,但工作并不顺利。嘿,您能建议我如何通过扩展SurfaceView来使用相同的代码吗?谢谢。@voidRy,你可以看到。
for (int i = 0; i < first_Points_Num; i++) {
for (int j = i; j < pointArray.length; j++) {
canvas.drawLine(pointArray[i].getX(), pointArray[i].getY(),
pointArray[j].getX(), pointArray[j].getY(), p0);
}
}