找了在網路上尋找到許多有關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);
希望這篇文章對大家有幫助。
Raymond&Fred_Technology
科技資訊_TECHNOLOGY
科技
2012年9月7日 星期五
2012年3月13日 星期二
[MFC]將picture control 填滿底色
最近遇到一個需要將picture control填滿底色的小程式
就順手把這程式放上來吧
CStatic *pStatic = (CStatic *)GetDlgItem(IDC_SHOW);//定義IDC_SHOW這個picture control物件
CDC *pDC = pStatic->GetDC();//pDC為代表pStatic這個物件的device
CRect rct;//建立一個矩形座標系,左上角為(0,0) 往右往下(x,y)遞增
pStatic->GetWindowRect(&rct);//抓出pStatic這個物件在畫面上的範圍
CBrush brs;//定義筆刷使用類別
//建立一個筆刷 裡頭RGB數值 請自行參閱色碼表
brs.CreateSolidBrush(RGB(255, 255, 255));
CRect picrct;//定義一個名為picrct的矩形座標系 讓它的範圍與IDC_SHOW這個picture control大小相同
picrct.top = 0;
picrct.left = 0;
picrct.bottom = rct.Height();
picrct.right = rct.Width();
pDC->FillRect(&picrct, &brs);//畫上顏色
實際應用上你可以放個button 按下時執行以上動作顯示顏色...etc ,up to U
就順手把這程式放上來吧
CStatic *pStatic = (CStatic *)GetDlgItem(IDC_SHOW);//定義IDC_SHOW這個picture control物件
CDC *pDC = pStatic->GetDC();//pDC為代表pStatic這個物件的device
CRect rct;//建立一個矩形座標系,左上角為(0,0) 往右往下(x,y)遞增
pStatic->GetWindowRect(&rct);//抓出pStatic這個物件在畫面上的範圍
CBrush brs;//定義筆刷使用類別
//建立一個筆刷 裡頭RGB數值 請自行參閱色碼表
brs.CreateSolidBrush(RGB(255, 255, 255));
CRect picrct;//定義一個名為picrct的矩形座標系 讓它的範圍與IDC_SHOW這個picture control大小相同
picrct.top = 0;
picrct.left = 0;
picrct.bottom = rct.Height();
picrct.right = rct.Width();
pDC->FillRect(&picrct, &brs);//畫上顏色
實際應用上你可以放個button 按下時執行以上動作顯示顏色...etc ,up to U
訂閱:
文章 (Atom)