【问题标题】:How do I set opacity on a Bitmap?如何在位图上设置不透明度?
【发布时间】:2011-11-12 09:21:04
【问题描述】:

我创建了一个具有位图字段的自定义对象。我将其中几个对象绘制到 View 的画布上,以模仿滚动的水平图像库。

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

我从各个论坛拼凑了以下代码,除了不透明度的变化之外,一切似乎都在工作。我已经确认我的位图是可变的,并且每一步都有 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");

    }

}

【问题讨论】:

    标签: android view canvas bitmap opacity


    【解决方案1】:

    我想这是我自己想出来的,但如果有人能提供更多见解,我欢迎任何反馈。

    我可以通过使用 BitmapDrawable 来做我想做的事。它是位图的包装器。编辑位图本身确实是永久性的。 BitmapDrawables 允许您在不直接影响底层 Bitmap 的情况下更改某些参数。

    【讨论】:

      猜你喜欢
      • 2014-09-05
      • 2011-04-07
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2015-11-10
      • 2017-11-13
      • 1970-01-01
      相关资源
      最近更新 更多