如何在位图上设置不透明度?

时间:2011-11-09 03:54:22

标签: android view canvas bitmap opacity

我创建了一个具有Bitmap字段的自定义对象。我正在将几个这些对象绘制到一个视图的画布上,以模仿滚动的水平图像库。

当用户长时间按下其中一个图像时,我想将剩余位图的不透明度更改为指定的百分比。这可能会给人一种他们因“编辑模式”变暗的印象,或者可能意味着他们已经恢复正常了。 (请注意,我不想永久更改位图。我希望​​能够动态调整其不透明度。)

我将来自各种论坛的以下代码拼凑在一起,除了不透明度的变化外,一切似乎都在起作用。我已经确认我的位图是可变的,并且每一步都有alpha。我做错了什么?

定位Android 2.1,API等级7

查看(为简洁而删节):

public class CanvasStoryEdit2 extends View
{

    public CanvasStoryEdit2(Context context, AttributeSet attrs) {
        super(context, attrs);

        for (int i = 0; i < getResources().getInteger(R.integer.maxAllowedSlides); i++)
        {

            ImageStoryEdit img = new ImageStoryEdit();

            //test images
            if (i == 0) { resource = R.drawable.a1; }
            else if (i == 1) { resource = R.drawable.a2; }
            else if (i == 2) { resource = R.drawable.a3; }
            else if (i == 3) { resource = R.drawable.a4; }
            else if (i == 4) { resource = R.drawable.a5; }

            Bitmap bmp = BitmapFactory.decodeResource(getResources(), resource);

            Log.d("TEST", "[" + Integer.toString(i) + "] - config: " + bmp.getConfig().toString());
            Log.d("TEST", "[" + Integer.toString(i) + "] - hasAlpha: " + Boolean.toString(bmp.hasAlpha()));
            Log.d("TEST", "[" + Integer.toString(i) + "] - isMutable: " + Boolean.toString(bmp.isMutable()));

            final int imgHeight = bmp.getHeight() / (bmp.getWidth() / imgWidth);

            bmp = Bitmap.createScaledBitmap(bmp, imgWidth, imgHeight, false);

            Log.d("TEST", "[" + Integer.toString(i) + "] - config: " + bmp.getConfig().toString());
            Log.d("TEST", "[" + Integer.toString(i) + "] - hasAlpha: " + Boolean.toString(bmp.hasAlpha()));
            Log.d("TEST", "[" + Integer.toString(i) + "] - isMutable: " + Boolean.toString(bmp.isMutable()));

            int width = bmp.getWidth();
            int height = bmp.getHeight();

            int[] pixels = new int[width * height];  

            bmp.getPixels(pixels, 0, width, 0, 0, width, height); 

            bmp.recycle();
            bmp = null;

            img.setBmp(Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888));
            img.getBmp().setPixels(pixels, 0, width, 0, 0, width, height); 

            pixels = null;

            Log.d("TEST", "[" + Integer.toString(i) + "] - config: " + img.getBmp().getConfig().toString());
            Log.d("TEST", "[" + Integer.toString(i) + "] - hasAlpha: " + Boolean.toString(img.getBmp().hasAlpha()));
            Log.d("TEST", "[" + Integer.toString(i) + "] - isMutable: " + Boolean.toString(img.getBmp().isMutable()));

            imageStoryEditList.add(img);

        }

    }

长按电话:

{
img.setOpacity(50);
invalidate();
}

ImageStoryEdit(也删节):

public class ImageStoryEdit
{

    private int opacity;
    public Bitmap bmp;


    public Bitmap getBmp() {
        return bmp;
    }

    public void setBmp(Bitmap bmp)
    {

        this.bmp = bmp;

        UpdateRectF();

    }

    public int getOpacity() 
    {
        return opacity;

    }

    public void setOpacity(int percent) 
    {

        //ADJUST FOR RANGE OF 0-100%
        percent = percent < 0 ? 0 : percent;
        percent = percent > 100 ? 100 : percent;

        this.opacity = percent;

        int opacity = (int) (this.opacity * 2.55);

        Log.d("TEST", "OPACITY = " + Integer.toString(percent) + " : " + Integer.toString(opacity));

        adjustOpacity(opacity);

    }

    private void adjustOpacity(int opacity)
    {

        Log.d("TEST", "OPACITY = " + Integer.toString(opacity));
        Log.d("TEST", this.bmp.getConfig().toString());
        Log.d("TEST", "hasAlpha: " + Boolean.toString(this.bmp.hasAlpha()));
        Log.d("TEST", "isMutable: " + Boolean.toString(this.bmp.isMutable()));

        Bitmap bmp2 = this.bmp.copy(Config.ARGB_8888, true);

        Canvas canvas = new Canvas(bmp2);

        Paint paint = new Paint(); 

        paint.setAlpha(opacity); 

        canvas.drawBitmap(bmp2, 0, 0, paint);

        this.bmp = bmp2;

        Log.d("TEST", this.bmp.getConfig().toString());
        Log.d("TEST", "hasAlpha: " + Boolean.toString(this.bmp.hasAlpha()));
        Log.d("TEST", "isMutable: " + Boolean.toString(this.bmp.isMutable()));
        Log.d("TEST", "DONE");

    }

}

1 个答案:

答案 0 :(得分:0)

我想我自己想出了这个,但如果有人能提供额外的见解,我欢迎任何反馈。

我能够通过使用BitmapDrawable做我想做的事。它是Bitmap的包装器。编辑位图本身确实是永久性的。 BitmapDrawables允许您更改某些参数而不直接影响基础Bitmap。