【问题标题】:How to drawing a path with a bitmap?如何用位图绘制路径?
【发布时间】:2011-10-23 18:08:19
【问题描述】:

我有一个小绘图应用程序,想使用“复杂”形状作为画笔,即星形。 使用简单的画笔绘图已经可以使用此代码:

remotePath.reset();
remotePath.moveTo(start_x, start_y);

float dx = Math.abs(end_x - start_x);
float dy = Math.abs(end_y - start_y);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
        remotePath.quadTo(start_x, start_y, (end_x + start_x) / 2, (end_y + start_y) / 2);
}

remotePath.lineTo(end_x, end_y);
// commit the path to our offscreen
mCanvas.drawPath(remotePath, remotePaint);
// kill this so we don't double draw
remotePath.reset();
invalidate();

我基本上想要使用此位图的相同功能:

Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.brush_star);

我目前的解决方案是使用点(坐标)列表来绘制位图。该解决方案的问题在于它仅在给定点绘制位图,导致每个绘制的位图之间存在间隙。我宁愿用简单的画笔画出流畅的线条,中间没有任何间隙。

位图绘制的当前代码:

        protected void onDraw(Canvas canvas) {

        // Make canvas white
        canvas.drawColor(Color.WHITE);

        // Paintable area
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

        canvas.drawPath(mPath, mPaint);

        for (Point point : points) {
            canvas.drawBitmap(complexBrush, point.x, point.y, p);
        }
    }

最好的方法是什么? 感谢您的帮助!

【问题讨论】:

    标签: android android-canvas drawing2d


    【解决方案1】:

    我用这个 点类:

    public class Point  implements Serializable {
    float x, y;
    float dx, dy;
    }
    

    绘制对象:

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(5);
    paint.setColor(Color.RED);
    paint.setAntiAlias(true);
    

    在画布上绘制:

    private void drawCanvas(Canvas canvas, List<Point> pts){
        if (pts.size() > 1){
            Path path = new Path();
            final int SMOOTH_VAL = 6;
            for(int i = pts.size() - 2; i < pts.size(); i++){
                if(i >= 0){
                    Point point = pts.get(i);
    
                    if(i == 0){
                        Point next = pts.get(i + 1);
                        point.dx = ((next.x - point.x) / SMOOTH_VAL);
                        point.dy = ((next.y - point.y) / SMOOTH_VAL);
                    }
                    else if(i == pts.size() - 1){
                        Point prev = pts.get(i - 1);
                        point.dx = ((point.x - prev.x) / SMOOTH_VAL);
                        point.dy = ((point.y - prev.y) / SMOOTH_VAL);
                    }
                    else{
                        Point next = pts.get(i + 1);
                        Point prev = pts.get(i - 1);
                        point.dx = ((next.x - prev.x) / SMOOTH_VAL);
                        point.dy = ((next.y - prev.y) / SMOOTH_VAL);
                    }
                }
            }
    
            boolean first = true;
            for(int i = 0; i < pts.size(); i++){
                Point point = pts.get(i);
                if(first){
                    first = false;
                    path.moveTo(point.x, point.y);
                }
                else{
                    Point prev = pts.get(i - 1);
                    path.cubicTo(prev.x + prev.dx, prev.y + prev.dy, point.x - point.dx, point.y - point.dy, point.x, point.y);
                }
            }
            canvas.drawPath(path, paint);
        } else {
            if (pts.size() == 1) {
                Point point = pts.get(0);
                canvas.drawCircle(point.x, point.y, 2, paint);
            }
        }
    }
    

    在位图画布上绘制:

    private void drawBitmap(Bitmap bmp, List<Point> pts) {
        Canvas c = new Canvas(bmp);
        drawCanvas(c, pts);
    }
    

    【讨论】:

    • 我们如何用多个位图绘制?就像我们改变颜色和绘制多个路径
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多