Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用画布绘制不同图案的线条?_Android_Android Canvas - Fatal编程技术网

Android 如何使用画布绘制不同图案的线条?

Android 如何使用画布绘制不同图案的线条?,android,android-canvas,Android,Android Canvas,嘿,我想用画布画一条不同图案的线 任何想法或建议都将不胜感激 提前感谢。您必须使用。文档说明: Path类封装复合(多轮廓)几何图形 由直线段、二次曲线和 三次曲线 例如,您可以扩展视图的并将触摸事件位置添加到视图的onTouchEvent(MotionEvent)方法中的路径中。然后您必须生成与最新触摸事件相对应的随机位置,并将其添加到路径的其他实例中。最后,在视图的onDraw()方法中,绘制所有路径。我希望这段代码可以帮助您理解我的想法: public class NetCanvas ex

嘿,我想用画布画一条不同图案的线

任何想法或建议都将不胜感激

提前感谢。

您必须使用。文档说明:

Path类封装复合(多轮廓)几何图形 由直线段、二次曲线和 三次曲线

例如,您可以扩展视图的
并将触摸事件位置添加到视图的
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);
                }
            }