0

カラースプラッシュアプ​​リを開発しています。フィンガーペイントを使用しています。

今、タッチイベントでビットマップをエンボスしたいと思っています。ここにエンボスを適用するとエンボスパスが赤色で描画されるデモが1つありますが、タッチ時にビットマップの後ろにエンボスしたいです。

private Path mPath;
private MaskFilter mEmboss;

public void init(){
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setDither(true);
    mPaint.setColor(color.RED);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(20);
    mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.4f, 6, 3.5f);
}



// on click event 
    switch (item.getItemId()) {
        case EMBOSS_MENU_ID:                        
            mPaint.setMaskFilter(mEmboss);
    }



// View Class method

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);           
    canvas.drawPath(mPath, mPaint);
    canvas.drawPath(circlePath, circlePaint);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    float x = ev.getX();
    float y = ev.getY();
    invalidate();
    return true;
}
4

1 に答える 1

2

私は最終的に解決策を見つけます:

同じビットマップで BitmapShader を使用する

private Path mPath;
private MaskFilter mEmboss;

public void init(){
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setDither(true);
    mPaint.setColor(color.RED);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(20);
BitmapShader fillBMPshader = new BitmapShader(bm_original, Shader.TileMode.MIRROR, Shader.TileMode.CLAMP);
mPaint.setShader(fillBMPshader);
    mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.4f, 6, 3.5f);
}    

// onclick event 
    switch (item.getItemId()) {
        case EMBOSS_MENU_ID:                        
            mPaint.setMaskFilter(mEmboss);
    }

// View Class method

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);           
    canvas.drawPath(mPath, mPaint);
    canvas.drawPath(circlePath, circlePaint);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    float x = ev.getX();
    float y = ev.getY();
    invalidate();
    return true;
}
于 2015-01-09T11:12:18.287 に答える