Android 具有渐变填充和曲线形状的画布绘制

Android 具有渐变填充和曲线形状的画布绘制,android,android-layout,android-canvas,draw,curve,Android,Android Layout,Android Canvas,Draw,Curve,我的题目似乎很普通。。但这与其他问题不同。。我尝试了很多解决方案,但还没有找到完美的解决方案。也不能理解绘图函数 这就是我迄今为止所尝试的: public class DrawingActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

我的题目似乎很普通。。但这与其他问题不同。。我尝试了很多解决方案,但还没有找到完美的解决方案。也不能理解绘图函数

这就是我迄今为止所尝试的:

public class DrawingActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drawing);

        ImageView img=(ImageView) findViewById(R.id.img);


        Bitmap bitmap = Bitmap.createBitmap(
                1000, // Width
                300, // Height
                Bitmap.Config.ARGB_8888 // Config
        );

        // Initialize a new Canvas instance
        Canvas canvas = new Canvas(bitmap);

        // Draw a solid color on the canvas as background
        canvas.drawColor(Color.LTGRAY);

        // Initialize a new Paint instance to draw the line
        Paint paint = new Paint();
        // Line color
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.STROKE);
        // Line width in pixels
        paint.setStrokeWidth(8);
        paint.setAntiAlias(true);


        final RectF oval = new RectF();

        // Set a pixels value to offset the line from canvas edge
        int offset = 0;

        canvas.drawLine(
                offset, // startX
                canvas.getHeight() / 2, // startY
                300, // stopX
                canvas.getHeight() / 2, // stopY
                paint // Paint
        );


        oval.set(250, 100, 300,200);

        canvas.drawArc(oval, 90, -(float) 90, false,paint);


        oval.set(450, 300, 500,350);

        canvas.drawArc(oval, 90, -(float) 90, false,paint);

        canvas.drawLine(
                300, // startX
                canvas.getHeight() -50, // startY
                1000, // stopX
                canvas.getHeight() -50, // stopY
                paint // Paint
        );

        // Display the newly created bitmap on app interface
        img.setImageBitmap(bitmap);
    }

}
我的输出:

所以我的问题是:

  • 如果有人能解释它的要点或示例代码,我想按照预期的输出绘制曲线
  • 想知道关于绘制弧左,上,右,下点(我读过文档,但它只是告诉他们是浮动的,没有对它的描述)
  • 我想用渐变色填充这个形状,只填充这个形状,而不是整个画布

  • 如有任何建议,将不胜感激。谢谢大家!

    使用路径可以绘制贝塞尔路径

    检查我的努力如下

     private class MyDrawView extends View {
        Paint paint;
        Path mPath;
    
        public MyDrawView(Context context) {
            this(context, null);
    
        }
    
        public MyDrawView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
    
            mPath = new Path();
            mPath.moveTo(200, 200);
            mPath.lineTo(200, 100);
            mPath.lineTo(600, 100);
            mPath.lineTo(600, 300);
            mPath.lineTo(300, 300);
            mPath.cubicTo(250, 270, 400, 170, 200, 200);
    
            paint = new Paint();
            paint.setColor(Color.BLACK);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(8);
            paint.setStrokeCap(Paint.Cap.ROUND);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setPathEffect(new CornerPathEffect(10));
            paint.setAntiAlias(true);
    
    
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawPath(mPath, paint);
            invalidate();
        }
    }
    
    初始化此自定义视图并添加到框架布局中。像

     MyDrawView myDrawView = new MyDrawView(this);
     frmCustom.addView(myDrawView);
    

    请参见
    Canvas#drawPath
    @pskink抱歉,如果可能,请您用一些代码解释一下。。目前为止,我一直在尝试,但没有得到任何结果:(因此,请使用
    Path
    objects@pskink我第一次尝试了canvas,所以不知道路径,也不知道如何使用它。我将尝试阅读文档,然后返回给您。例如,您可以告诉我一件事,如何在活动中使用该类吗?我的意思是只需要创建对象?并在mydrawview类中使用该对象adient color.
    受保护的空白大小已更改(int w、int h、int oldw、int oldh){paint.setShader(新的线性渐变(0、0、w、h、color.BLUE、color.RED、Shader.TileMode.MIRROR));}
    嘿,我想再问一件事,我想在这个形状下面添加相同的形状,它看起来就像这个阴影……那么我需要在moveTo中调整dy吗?或者请告诉我们任何建议。