2012年11月26日 星期一

Android: Reflection效果



 View:Android顯示畫面的容器,可以是內建任何繼承View的元件,像是ImageView GridView Button等,也可以是自建繼承View的類別

 Bitmap:可視為儲存圖片畫素內容的物件,它可以將許多不同格式的圖片轉換成串流(0與1)讓系統可以看得懂

 Canvas:可視為畫布或是小畫家工具,你可以在上面話一條線,一個圓或是任何東西,畫完之後再將他奘到容器裡顯示,通常是在自建的View中顯示,然後當程式執行時便會呼叫這個新類別的onDraw(Canvas canvas)方法自動繪製

 Drawable:Android提供了許多不同框架的Drawable物件可供使用,像BitmapDrawable, ScaleDrawable, ShapeDrawable等等等...使用方法通常是直接將Drawable直接設定給容器即可(像是ImageView)
  
 

這個例子特別的點是在, 通常我們為了達到彈性需求(不想用內建的容器像ImageView、GridView、ListView、Button、EditText...
所以會是利用一個類別繼承View來當成容器,然後利用Canvas畫完之後,再將他裝到自建的容器中顯示,通常的做法是在@override中的onDraw(Canvas canvas)中,這個參數傳進來的canvas可視為一張撲滿螢幕的大畫布利用各式的Drawable物件將Canvas給畫出




package com.briview.reflection;

import ...
public class MainActivity extends Activity {
private ImageView imageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

imageView = (ImageView) findViewById(R.id.imageView1);
Bitmap bmp = ((BitmapDrawable) getResources().getDrawable(R.drawable.a))
.getBitmap();
imageView.setImageBitmap(createReflectedImage(bmp));

}

/*
* public static Bitmap createBitmap (Bitmap source, int x, int y, int
* width, int height, Matrix m, boolean filter) 須注意以下規則 x + width <=
* bmp.getWidth(); y + height <= bmp.getHeight();
*/

private Bitmap createReflectedImage(Bitmap originalImage) {
int width = originalImage.getWidth();
int height = originalImage.getHeight();
Matrix matrix = new Matrix();
matrix.preScale(1, -1);
/*
* create bitmap object
*/
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
height / 2, width, height / 2, matrix, false);
// 創建總圖片(原圖片 + 倒影圖片)
Bitmap finalReflection = Bitmap.createBitmap(width,
(height + height / 2), Config.ARGB_8888);
Paint shaderPaint = new Paint();
// 創建線性漸變LinearGradient物件
LinearGradient shader = new LinearGradient(0,
originalImage.getHeight(), 0, finalReflection.getHeight() + 1,
0x70ffffff, 0x00ffffff, TileMode.MIRROR);
shaderPaint.setShader(shader);
// 漸層效果!!
shaderPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
// 畫布畫出反轉圖片大小區域,然後把漸變效果加到其中,就出現了圖片的倒    
                   影效果。


/*
 * draw on the canvas
 */
// 創建畫布
Canvas canvas = new Canvas(finalReflection);
canvas.drawBitmap(originalImage, 0, 0, null);
canvas.drawBitmap(reflectionImage, 0, height + 1, null);


canvas.drawRect(0, height + 1, width, finalReflection.getHeight(),
           shaderPaint);

return finalReflection;

}

}



沒有留言:

張貼留言