科技

2012年9月7日 星期五

[Android] ImageView 與 Bitmap 應用

找了在網路上尋找到許多有關Bitmap運用的文章,

最後總結成一個適合自己理解的內容。

希望這篇能給大家一些幫助,話不多說直接來看範例吧。

下面範例是 利用觸碰螢幕上的button(vol_plusbtn)模擬音量增加,並將音量條顯示於
imageview(vol_full)上頭。而在vol_full之下是另一張imageview(vol_empty),兩者是重疊的。

public class Vol extends Activity {


ImageView  vol_empty;
ImageView vol_full;
ImageButton vol_plusbtn;

int vol_val;
int width ;
int height ;
int []pixels;
Bitmap bmp_full,bmp_draw,bmp_empty,bmp_temp;




@Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.vol);
 
   vol_full = (ImageView)findViewById(R.id.vol_full);
   vol_empty = (ImageView) findViewById(R.id.vol_empty);
   vol_plusbtn = (ImageButton)findViewById(R.id.vol_plus);



//Vol_plus
      vol_plusbtn.setOnTouchListener(new View.OnTouchListener(){          
          public boolean onTouch(View v, MotionEvent event) {            
                  if(event.getAction() == MotionEvent.ACTION_UP){    
                 
                  ((ImageButton)v).setImageDrawable(getResources().getDrawable(R.drawable.vol_plus));
                 
                  }else if(event.getAction() == MotionEvent.ACTION_DOWN){    
               
                      ((ImageButton)v).setImageDrawable(getResources().getDrawable(R.drawable.vol_plus2));
                      if(vol_val==40)
                   {
                   }
                   else
                   {
                   vol_val++;
                 
                   VolDraw(vol_val);
                                  String formatStr = "%d";
                   String formatAns2 = String.format(formatStr,vol_val);
                   vol_num.setText(formatAns2);
                                   
                   }
                   
                   
                  }
                  return false;    
          }});


public void VolDraw(int vol)
{
width = 285;
height = 20;
if(vol==0)
{
//音量為0時將vol_full設為透明,顯示vol_empty全圖。
vol_full.setAlpha(0);
}
else
{
//音量不為0,將vol_full透明度設回原值。
vol_full.setAlpha(255);
pixels = new int[width * height];

//讀取vol_full.bmp將它放入一張bitmap中,bitmap大小隨著音量大小而不同。
if(vol%2==1)
{
bmp_full = Bitmap.createBitmap(3+14*((vol)/2), 20, Config.ARGB_8888);
//bmp_empty = Bitmap.createBitmap(285, 20, Config.ARGB_8888);
}
else
{
bmp_full = Bitmap.createBitmap(3+14*(vol/2), 20, Config.ARGB_8888);
}
bmp_full =             BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.vol_full));


//設定bmp_temp大小,用來顯示音量bar條
bmp_temp = Bitmap.createBitmap(285, 20, Config.ARGB_8888);

//選取欲顯示的音量BAR條範圍,放入pixels array
if(vol%2==1)
{
   //將兩張圖拼接,ex vol=21   20,1兩張音量條結合在一起。
bmp_full.getPixels(pixels, 0, width, 0, 0, (14*((vol-1)/2))+1, 20);

bmp_full.getPixels(pixels, (14*((vol-1)/2))+2, width, 2,0, 7, 20);
}
else
{
bmp_full.getPixels(pixels, 0, width, 0, 0,3+14*(vol/2), height);
}


bmp_draw = bmp_temp.copy(bmp_temp.getConfig(),true);
bmp_draw.setPixels(pixels, 0, width,0, 0, width, height);
}
vol_full.setImageBitmap(bmp_draw);      
}





}

通常要在畫面上畫東西 首先 你必須Create 一張 Bitmap 當做畫布
並且定義它的寬、高、以及config
ex: bmp_full = Bitmap.createBitmap(3+14*((vol)/2), 20, Config.ARGB_8888);
ARGB_8888是整張圖最高的像素限制
,其它的資訊請查找http://developer.android.com/reference/android/graphics/Bitmap.html

當Create好bitmap後 接下來就是把圖檔l讀入
ex:
bmp_full =  BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.vol_full));

從bitmap中讀取pixels 放入想儲存的陣列裡頭
ex: bmp_full.getPixels(pixels, 0, width, 0, 0, (14*((vol-1)/2))+1, 20);

getPixels(想儲存的陣列, 想儲存的陣列中從第幾個開始儲存, 意義不明,
              從bitmapX坐標中第x地方開始get,從bitmapY中第y地方開始get
              row中幾個pixel ,有幾個row)


若想將兩張圖拼貼在一起的話


ex :
bmp_full.getPixels(pixels, 0, width, 0, 0, (14*((vol-1)/2))+1, 20);

bmp_full.getPixels(pixels, (14*((vol-1)/2))+2, width, 2,0, 7, 20);

須注意 兩次get中 的起始位置為何。

為了解決setPixels它不是易變,可變的關係 所以使用.copy() 這function來解決這問題


bmp_draw = bmp_temp.copy(bmp_temp.getConfig(),true);
bmp_draw.setPixels(pixels, 0, width,0, 0, width, height);

最後再將bitmap放入imageview中顯示 就完成了。
vol_full.setImageBitmap(bmp_draw);



希望這篇文章對大家有幫助。