標籤:android style class blog code java
我們不能總是依賴於BitmapFactory 下面告訴大家怎麼從Bitmaqp中截取某一部分建立新的Bitmap
系統會有一個預設png圖片:icon.png 但是這個圖片中最外層會有白色的 比較討厭 現在以此為例 說說怎麼截取 因為其外層為白色 顯示不出來 所以我用了 *.9.png 作為其邊界
建立Bitmaop 且指向icon.png
<span style="font-size:12px;">Bitmap ori = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon); </span>
建立布局檔案 有2個ImageView 一個供原圖顯示 一個供切割後顯示
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/layout" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/image1" android:layout_gravity="center_horizontal" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/image2" android:layout_gravity="center" /> </LinearLayout>
初始設定變數
lLauout = (LinearLayout)findViewById(R.id.layout); iv1 = (ImageView)findViewById(R.id.image1); iv2 = (ImageView)findViewById(R.id.image2);
得到原圖的寬度與高度 供後面使用
<span style="font-size:12px;">width = ori.getWidth(); height = ori.getHeight(); </span>
定義變數 標誌切割位置 並初始化之
<span style="font-size:12px;"><span class="keyword" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px; color: rgb(127, 0, 85); font-weight: bold;">int</span><span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px;"> startX,startY,lengthX,lengthY; </span></span>
<span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px;"></span>
<span style="font-size:12px;">startX = 0; startY = 0; lengthX = width; lengthY = height; </span>
如何選取圖片位置函數原型: Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)
方法1:不斷調整參數:x,y,width,heighy
方法2:利用導航鍵 上下左右分別控制上述4變數
導航鍵 左: x
導航鍵 右: width
導航鍵 上: y
導航鍵 下: height
使之向圖片中央靠攏 且按下一下 移動固定的距離
public boolean onKeyDown(int keyCode, KeyEvent msg){ switch(keyCode){ case KeyEvent.KEYCODE_DPAD_LEFT: updateLeft(); break; case KeyEvent.KEYCODE_DPAD_RIGHT: updateRight(); break; case KeyEvent.KEYCODE_DPAD_UP: updateUp(); break; case KeyEvent.KEYCODE_DPAD_DOWN: updateDown(); break; case KeyEvent.KEYCODE_DPAD_CENTER: showResult(); break; } return false; }
還需要判斷移動是否合理
以下幾種情況不合理:
1. 當圖形左邊 比 圖形最大寬度 還大
2. 當圖形上邊 比 圖形最大高度 還大
3. 圖形寬度 或 高度 小於 0
public boolean isUpdateOK(){ if((startX > lengthX)||(startY > lengthY)||(lengthX > 0)||(lengthY > 0)){ return false; } else { return true; } }
具體移動方法
public void updateLeft(){ startX += step; lengthX = width-startX; lengthY = height-startY; if(isUpdateOK()){ target1.recycle(); target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY); iv2.setImageBitmap(target1); setContentView(lLauout); } } public void updateUp(){ startY += step; lengthX = width-startX; lengthY = height-startY; if(isUpdateOK()){ target1.recycle(); target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY); iv2.setImageBitmap(target1); setContentView(lLauout); } } public void updateRight(){ lengthX -= step; if(isUpdateOK()){ target1.recycle(); target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY); iv2.setImageBitmap(target1); setContentView(lLauout); } } public void updateDown(){ lengthY -= step; if(isUpdateOK()){ target1.recycle(); target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY); iv2.setImageBitmap(target1); setContentView(lLauout); } } public void showResult(){ AlertDialog.Builder ab = new AlertDialog.Builder(this); AlertDialog aDialog; ab.setMessage("startX:"+startX+"\n"+"startY:"+startY+"\n"+"lengthX:"+lengthX+"\n"+"lengthY:"+lengthY).setTitle("show result").show();; aDialog = ab.create(); aDialog.show(); }
emulator 運行情況: