2011-11-09 31 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允许您更改某些参数,而不会直接影响底层位图。