如何在Android中以自定义笔触样式绘制线条?

时间:2018-11-06 21:35:01

标签: android

编辑: 我的第一部分是独特的,但是第二部分与其他一些问题类似。 主要问题: 这是我的课程代码,我使用该课程从drawable绘制具有自定义笔触形状的线条。我想画一条线,但是它只画了一些点,如下图所示。有解决这个问题的主意吗? result

public class MainDrawingView extends View {
    private Bitmap mBitmapBrush;
    private Bitmap rBitmapBrush;
    private Vector2 mBitmapBrushDimensions;
    private List<Vector2> mPositions = new ArrayList<Vector2>(100);

    private static final class Vector2 {
        public Vector2(float x, float y) {
            this.x = x;
            this.y = y;
        }
        public final float x;
        public final float y;
    }

    public MainDrawingView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mBitmapBrush = BitmapFactory.decodeResource(context.getResources(), R.drawable.brush01);
        rBitmapBrush = Bitmap.createScaledBitmap(mBitmapBrush, 10, 10, false);
        mBitmapBrushDimensions = new Vector2(rBitmapBrush.getWidth(), rBitmapBrush.getHeight());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        for (Vector2 pos : mPositions) {
            canvas.drawBitmap(rBitmapBrush, pos.x, pos.y, null);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_MOVE:
                final float posX = event.getX();
                final float posY = event.getY();
                mPositions.add(new Vector2(posX - mBitmapBrushDimensions.x / 2, posY - mBitmapBrushDimensions.y / 2));
                invalidate();
        }
        return true;
    }
}

更新: 我尝试另一堂课来画我的drawable的一条线,但是我遇到了2个新问题!首先;当我使用 setShader 时,触摸并在屏幕上移动手指时没有任何线条。第二个;当在代码中注释 setShader 线时,我可以画一条简单的黑线,但是如果我快速画一条曲线,结果是折线!而不是真正的曲线。那么解决这些问题的想法是什么?

result2

public class MainDrawingView extends View {
    private Bitmap mBitmapBrush;
    private Bitmap rBitmapBrush;
    private BitmapShader mBitmapShader;
    private Paint paint = new Paint();
    private Path path = new Path();

    public MainDrawingView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mBitmapBrush = BitmapFactory.decodeResource(context.getResources(), R.drawable.brush01);
        rBitmapBrush = Bitmap.createScaledBitmap(mBitmapBrush, 10, 10, false);
        mBitmapShader = new BitmapShader(rBitmapBrush, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(5f);
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        //paint.setShader(mBitmapShader);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawPath(path, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float eventX = event.getX();
        float eventY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(eventX, eventY);
                return true;
            case MotionEvent.ACTION_MOVE:
                path.lineTo(eventX, eventY);
                break;
            default:
                return false;
        }
        invalidate();
        return true;
    }
}

0 个答案:

没有答案