Android 多次在同一位图上绘制

Android 多次在同一位图上绘制,android,canvas,bitmap,android-drawable,Android,Canvas,Bitmap,Android Drawable,我需要生成一个圆形位图的效果,这个圆形将从中心开始增长,直到达到最大半径,为此我编写了以下方法: public Bitmap applyDrawingEffect(Bitmap src, int nRadiusprct) { // image size int width = src.getWidth(); int height = src.getHeight(); // create bitmap output Bitmap result = Bit

我需要生成一个圆形位图的效果,这个圆形将从中心开始增长,直到达到最大半径,为此我编写了以下方法:

public Bitmap applyDrawingEffect(Bitmap src, int nRadiusprct) 
{
     // image size
    int width = src.getWidth();
    int height = src.getHeight();
    // create bitmap output
    Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    // set canvas for painting
    Canvas canvas = new Canvas(result);
    canvas.drawARGB(0, 0, 0, 0);

    // config paint
    final Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(Color.BLACK);

    // config rectangle for embedding
    final Rect rect = new Rect(0, 0, width, height);
    final RectF rectF = new RectF(rect);

    // draw rect to canvas
    //canvas.drawRoundRect(rectF, round, round, paint);
    float fRadius = (width<=height) ? (width/2) : (height/2);  
    canvas.drawCircle(width/2, height/2, (fRadius * nRadiusprct/100), paint);

    // create Xfer mode
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    // draw source image to canvas
    canvas.drawBitmap(src, rect, rect, paint);

    // return final image
    return result;
}
公共位图applyDrawingEffect(位图src,int nRadiusprct)
{
//图像大小
int width=src.getWidth();
int height=src.getHeight();
//创建位图输出
位图结果=Bitmap.createBitmap(宽度、高度、Bitmap.Config.ARGB_8888);
//布景
画布=新画布(结果);
drawARGB(0,0,0,0);
//配置油漆
最终油漆=新油漆();
paint.setAntiAlias(真);
油漆。设置颜色(颜色。黑色);
//配置用于嵌入的矩形
最终矩形=新矩形(0,0,宽度,高度);
最终RectF RectF=新的RectF(rect);
//将矩形绘制到画布
//canvas.drawRoundRect(rectF,round,round,paint);

float fRadius=(width对于使用画布和位图的简单方法,您可以将其与Androids的一种动画方法一起使用,以完成繁重的工作。下面,我使用值animator编写了一个平移动画,将我的位图移动到画布内。无需反复重新创建位图

public void doCanvas(){
    //Create our resources
    Bitmap bitmap = Bitmap.createBitmap(mLittleChef.getWidth(), mLittleChef.getHeight(), Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(bitmap);
    final Bitmap chefBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.dish_special);
    final Bitmap starBitmap= BitmapFactory.decodeResource(getResources(),R.drawable.star);

    //Link the canvas to our ImageView
    mLittleChef.setImageBitmap(bitmap);

    ValueAnimator animation= ValueAnimator.ofInt(canvas.getWidth(),0,canvas.getWidth());
    animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int value = (Integer) animation.getAnimatedValue();
            //Clear the canvas
            canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
            canvas.drawBitmap(chefBitmap, 0, 0, null);
            canvas.save();
            canvas.translate(value,0);
            canvas.drawBitmap(starBitmap, 0, 0, null);
            canvas.restore();
            //Need to manually call invalidate to redraw the view
            mLittleChef.invalidate();
        }
    });
    animation.addListener(new AnimatorListenerAdapter(){
        @Override
        public void onAnimationEnd(Animator animation) {
            simpleLock= false;
        }
    });
    animation.setInterpolator(new LinearInterpolator());
    animation.setDuration(mShortAnimationDuration);
    animation.start();
}
有关代码和画布的更多信息,以及使用画布和位图的不同方式,请参阅

我认为,您可以在显示位图的视图的onDraw上执行此操作。然后继续使视图无效,直到达到全半径。查看BitmapShader,您可以创建一个绘制对象,并将位图中的BitmapShader应用于该对象,然后只需绘制一个填充圆,它就可以完成您需要的操作。这是关于BitmapShader的教程