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給畫出

859171DABA8376E38FA3ADBDAC4699  

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;

 

}

 

}
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()