【问题标题】:Drawing a repeated image (tile) along a path沿路径绘制重复的图像(平铺)
【发布时间】:2016-02-01 11:23:40
【问题描述】:

我正在尝试沿路径从资源中重复图像,就像PathEffect 中的形状一样。下面是我所拥有的与我正在努力实现的两个图像。

  • 我使用带有三角形的PathDashPathEffect 实现的效果: Screenshot
  • 我想要的结果应该是这样的: Desired

这是我的代码:

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathDashPathEffect;
import android.graphics.PathEffect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class ImageLineView extends View {

    private Paint mPaint;

    private Bitmap mDrawingBitmap;
    private Canvas mDrawingCanvas;

    private Path    mPath;
    private Paint   mBitmapPaint;

    private static final int BACKGROUND_COLOR = Color.WHITE;

    private static final int CENTER_STROKE_WIDTH = 10;

    public ImageLineView(Context context) {
        super(context);
        initialize();
    }

    public ImageLineView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialize();
    }

    public ImageLineView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initialize();
    }

    @SuppressLint("NewApi")
    public ImageLineView(Context context, AttributeSet attrs, int                                                defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        initialize(); 
    }

    private void initialize() {
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);

        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setFilterBitmap(true);
        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeWidth(10);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setPathEffect(getTrianglePathEffect(CENTER_STROKE_WIDTH));

        setLayerType(LAYER_TYPE_SOFTWARE, null);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        // Foreground Bitmap
        if (mDrawingBitmap == null) {
            mDrawingBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        } else {
            mDrawingBitmap = Bitmap.createScaledBitmap(mDrawingBitmap, w, h, false);
        }
        mDrawingCanvas = new Canvas(mDrawingBitmap);

        drawInitialView();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mDrawingBitmap, 0, 0, mBitmapPaint);
    }

    private void drawInitialView() {
        mDrawingCanvas.drawColor(BACKGROUND_COLOR);
    }


    private void touchDraw(float x, float y) {

        mDrawingCanvas.drawColor(BACKGROUND_COLOR);

        mPath.reset();
        mPath.moveTo(x, y);

        int canvasWidth = mDrawingCanvas.getWidth();
        int canvasHeight = mDrawingCanvas.getHeight();

        mPath.moveTo(x,y);
        mPath.lineTo(0,0);
        mPath.moveTo(x,y);
        mPath.lineTo(0,canvasHeight);
        mPath.moveTo(x,y);
        mPath.lineTo(canvasWidth,0);
        mPath.moveTo(x,y);
        mPath.lineTo(canvasWidth,canvasHeight);


        mDrawingCanvas.drawPath(mPath, mPaint);
        mPath.reset();

    }

    private PathEffect getTrianglePathEffect(int strokeWidth) {
          return new PathDashPathEffect(
                  getTriangle(strokeWidth),
                  strokeWidth,
                  0.0f,
                  PathDashPathEffect.Style.ROTATE);
    }

    private Path getTriangle(float size) {
      Path path = new Path();
      float half = size / 2;
      path.moveTo(-half, -half);
      path.lineTo(half, -half);
      path.lineTo(0, half);
      path.close();
      return path;
    }

    private void touchDown(float x, float y) {
        touchDraw(x, y);
    }

    private void touchMove(float x, float y) {
        touchDraw(x, y);
    }

    private void touchUp() {
        resetCanvas();
    }

    private void resetCanvas() {
        drawInitialView();

    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();
        float y = event.getY();

        int motionAction = event.getAction();

        switch (motionAction) {
        case MotionEvent.ACTION_DOWN:

            touchDown(x, y);
            invalidate();

            break;

        case MotionEvent.ACTION_MOVE:

            touchMove(x, y);
            invalidate();

            break;

        case MotionEvent.ACTION_UP:
            touchUp();
            invalidate();
            break;
        default:
            break;
        }

        return true;
    }

}

【问题讨论】:

    标签: android path drawing


    【解决方案1】:

    试试下面这段代码

    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Paint.Style;
    import android.graphics.Rect;
    import android.graphics.Shader.TileMode;
    import android.graphics.drawable.BitmapDrawable;
    import android.view.View;
    
    public class Tiling extends View {
        Rect rect;
        Bitmap mBitmap;
        BitmapDrawable mDrawable;
    
    public Tiling(Context mContext) {
        super(mContext);
        rect = new Rect(0, 0, 100, 100);
        mBitmap = loadBitmap();
        mDrawable = new BitmapDrawable(mContext.getResources(), mBitmap);
        mDrawable.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        mDrawable.setBounds(rect);
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mDrawable.draw(canvas);
    }
    
    public Bitmap loadBitmap() {
    
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        Bitmap bm = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bm);
        canvas.drawRect(0, 0, 10, 10, paint);
        paint.setStyle(Style.STROKE);
        paint.setColor(Color.WHITE);
        canvas.drawRect(0, 0, 9, 9, paint);
        return bm;
    }
    

    }

    【讨论】:

    • 您能否说明我如何使用此代码来解决我的问题?谢谢。
    猜你喜欢
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2023-03-05
    相关资源
    最近更新 更多