0

Я написал код, который может Роспись в onTouch, это не является моим код:андроид картины карандаш эффект

class DrawingPanel extends View implements View.OnTouchListener { 
private static final String TAG = "DrawView"; 

private static final float MINP = 0.25f; 
private static final float MAXP = 0.75f; 

private Canvas mCanvas; 
private Path mPath; 
private Paint  mPaint; 
private LinkedList<Path> paths = new LinkedList<Path>(); 

public DrawingPanel(Context context) { 
super(context); 
setFocusable(true); 
setFocusableInTouchMode(true); 

this.setOnTouchListener(this); 

mPaint = new Paint(); 
mPaint.setAntiAlias(true); 
mPaint.setDither(true); 
mPaint.setColor(Color.BLACK); 
mPaint.setStyle(Paint.Style.STROKE); 
mPaint.setStrokeJoin(Paint.Join.ROUND); 
mPaint.setStrokeCap(Paint.Cap.ROUND); 
mPaint.setStrokeWidth(6); 
mCanvas = new Canvas(); 
mPath = new Path(); 
paths.add(mPath); 

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

@Override 
protected void onDraw(Canvas canvas) {    

    for (Path p : paths){ 
     canvas.drawPath(p, mPaint); 
    } 
} 

private float mX, mY; 
private static final float TOUCH_TOLERANCE = 4; 

private void touch_start(float x, float y) { 
    mPath.reset(); 
    mPath.moveTo(x, y); 
    mX = x; 
    mY = y; 
} 
private void touch_move(float x, float y) { 
    float dx = Math.abs(x - mX); 
    float dy = Math.abs(y - mY); 
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
     mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
     mX = x; 
     mY = y; 
    } 
} 
private void touch_up() { 
    mPath.lineTo(mX, mY); 
    // commit the path to our offscreen 
    mCanvas.drawPath(mPath, mPaint); 
    // kill this so we don't double draw    
    mPath = new Path(); 
    paths.add(mPath); 
} 




@Override 
public boolean onTouch(View arg0, MotionEvent event) { 
    float x = event.getX(); 
    float y = event.getY(); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touch_start(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touch_move(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touch_up(); 
      invalidate(); 
      break; 
    } 
    return true; 

} }

моего код работает идеально, но не я хочу, чтобы изменить картины эффекта. Я хочу, чтобы эффект карандаша был полезен. Как я могу решить свою проблему? если кто-нибудь знает решение, пожалуйста, помогите me.thanks пс я не знаю, идеальный customviews и Canvas в Android и мне нужна помощь спасибо всем

ответ

0

я достиг этого эффекта с помощью рисования растровых изображений текстуры на холсте, и это выглядит : -

Черный фон

enter image description here

текстуры изображения

enter image description here

enter image description here

текстура изображения: -

enter image description here

Вот мой взгляд класс: -

import java.util.ArrayList; 
import java.util.List; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.view.MotionEvent; 
import android.view.View; 

import com.serveroverload.dali.R; 

public class CanvasBrushDrawing extends View { 
    private Bitmap mBitmapBrush; 
    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 CanvasBrushDrawing(Context context) { 
     super(context); 

// load your brush here 
     mBitmapBrush = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); 
     mBitmapBrushDimensions = new Vector2(mBitmapBrush.getWidth(), mBitmapBrush.getHeight()); 

     setBackgroundColor(0xffffffff); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     for (Vector2 pos : mPositions) { 
      canvas.drawBitmap(mBitmapBrush, 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; 
    } 
} 

Вы можете использовать этот вид в своей деятельности, как это: -

setContentView(new CanvasBrushDrawing(MainActivity.this)); 

Теперь вы только лучшие файлы текстур от вашего дизайнера.