2011-11-09 36 views
1

我創建了一個具有位圖字段的自定義對象。我將這些對象中的幾個繪製到視圖的畫布上以模仿滾動的水平圖像庫。如何在位圖上設置不透明度?

當用戶長按其中一個圖像時,我想將其餘位圖的不透明度更改爲指定的百分比。這可能會讓人覺得他們已經爲「編輯模式」蒙上了一層陰影,或者這意味着他們已經恢復了正常。 (請注意,我不想永久地改變位圖,我希望能夠隨時調整其不透明度。)爲不透明度的變化。我已經確認,我的Bitmap是可變的,並且每一步都有alpha。我究竟做錯了什麼?

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

ImageStoryEdit(也:

瞄準了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); 

     } 

    } 

呼叫刪節):

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"); 

    } 

} 

回答

0

我想我自己想出了這一個,但我歡迎任何反饋,如果任何人都可以提供更多的見解。

我能夠通過使用BitmapDrawable來做我想做的事。它是一個位圖的包裝。編輯位圖本身確實是永久的。 BitmapDrawables允許您更改某些參數,而不會直接影響底層位圖。