Как установить непрозрачность на растровом изображении? - PullRequest
1 голос
/ 09 ноября 2011

Я создал пользовательский объект, который имеет поле Bitmap.Я рисую несколько таких объектов на холсте вида, чтобы имитировать прокручиваемую горизонтальную галерею изображений.

Когда пользователь долго нажимает одно из изображений, я хочу изменить непрозрачность оставшихся растровых изображений науказанный процент.Это может создать впечатление, что они потемнели для «режима редактирования», или это может означать, что они вернулись в нормальное состояние.(Обратите внимание, что я не хочу постоянно изменять битовые карты. Я хочу иметь возможность регулировать их непрозрачность на лету.)

Я собрал следующий код из различных форумов, и все, кажется,работает за исключением изменения непрозрачности.Я подтвердил, что мои растровые изображения являются изменяемыми и имеют альфа на каждом шагу.Что я делаю не так?

Ориентация на 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 голосов
/ 12 ноября 2011

Я думаю, что я понял это самостоятельно, но я приветствую любые отзывы, если кто-то может предложить дополнительное понимание.

Я смог сделать то, что хотел, используя BitmapDrawable. Это обертка для растрового изображения. Редактирование самого растрового изображения действительно является постоянным. BitmapDrawables позволяют вам изменять определенные параметры, не влияя непосредственно на базовое растровое изображение.

...