在我的项目中,我有一个位图填充整个屏幕.在这个位图上,我绘制了一个路径
android.graphics.Canvas.drawPath(Path path, Paint paint)
Run Code Online (Sandbox Code Playgroud)
设置绘画以便描边和填充路径的内容.我将实现的是擦除与路径相交的bitamp部分.我设法使用另一个bitmmap而不是路径,并使用porter duff规则获得相同的行为.有没有机会对路径做同样的事情?
mPaintPath.setARGB(100, 100, 100, 100);// (100, 100, 100, 100)
mPaintPath.setStyle(Paint.Style.FILL_AND_STROKE);
mPaintPath.setAntiAlias(true);
mPath.moveTo(x0, y0));
mPath.lineTo(x1, y1);
mPath.lineTo(x2, y2);
mPath.lineTo(x3, y3);
mPath.lineTo(x0, y0);
mPath.close();
c.drawPath(mPath, mPaintPath);
Run Code Online (Sandbox Code Playgroud) 所以我试图加快一些我们正在做的绘图(用alpha透明度绘制弧的一部分)并尝试将整个弧缓存到单独的位图中,并选择性地使用alpha蒙版显示它.
从我已经完成的研究(Android的Xfermodes API演示,此示例和此工具),如果我有以下两个图形:
并使用以下内容绘制:
Xfermode DST_IN = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
canvas.drawBitmap(circle, 0, 0, paint);
paint.setXfermode(DST_IN);
canvas.drawBitmap(arc, 0, 0, paint);
paint.setXfermode(null);
Run Code Online (Sandbox Code Playgroud)
我应该得到这个结果:
将目标图像(圆圈)剪切到绘制源图像(圆弧)的区域.相反,我得到了完整的圆圈.如果我只是绘制弧线,它会出现在正确的位置,如果我使用DST_OUT,我得到预期结果的倒数(圆圈的其他三个象限).
我也确保为这个视图禁用硬件渲染,以防这个Xfermode出现问题,但它没有什么区别.
我把它分解成一个单独的项目,在最简单的级别试图让它工作,并使用下面的代码,我仍然有同样的问题:
public class ClippedView extends View {
private Xfermode DST_IN, DST_OUT;
private Paint paint;
public ClippedView(Context context) {
super(context);
init();
}
private void init() {
setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
DST_IN = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
DST_OUT = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);
}
@Override
protected void onDraw(Canvas canvas) { …
Run Code Online (Sandbox Code Playgroud) 我有以下代码来激活/停用橡皮擦:
public PorterDuffXfermode clear = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
eraseB.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!eraser) {
eraser = true;
eraseB.setImageResource(R.drawable.erase_on);
paint = new Paint(Paint.DITHER_FLAG);
paint.setColor(0x00000000);
paint.setAlpha(0x00);
paint.setXfermode(clear);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(stroke);
paintv.setPaint(paint);
} else {
eraser = false;
eraseB.setImageResource(R.drawable.erase);
paint = new Paint(Paint.DITHER_FLAG);
paint.setDither(true);
paint.setXfermode(null);
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(stroke);
paintv.setPaint(paint);
}
}
});
Run Code Online (Sandbox Code Playgroud)
setPaint来自我的customView:
public void setPaint(Paint paint) {
this.paint = paint;
LogService.log("in setPaint", "paint = " + paint);
}
Run Code Online (Sandbox Code Playgroud)
和onDraw我用:
canvas.drawPath(mPath, paint);
Run Code Online (Sandbox Code Playgroud)
如果我停用橡皮擦,它将用红线绘制,但相反,如果我激活橡皮擦,而不是擦除,它将绘制一条黑线.我怎样才能解决这个问题
我正在为大学做一个小项目,并想知道是否有人可以告诉我如何做一个刮刮卡应用程序.这个应用程序应该有一个图像覆盖另一个 顶部的那个应该允许用户根据它们在图像上摩擦的位置来移除图像,因此移除的图像的一部分显示下面的图像.非常像刮刮卡.任何帮助都会很棒!
这是我目前正在使用的代码.
public class workinggraphics extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
setContentView(new Panel(this));
LinearLayout l1 = (LinearLayout) findViewById(R.id.LAYOUTTEST1);
Panel p1 = new Panel(null);
}
class Panel extends View{
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mPaint;
// private Paint nPaint;
Bitmap bitmap;
Canvas pcanvas ;
int x = 0;
int y =0;
int r =0;
public Panel(Context context) {
super(context);
Log.v("Panel", …
Run Code Online (Sandbox Code Playgroud)