package com.example.android.recipe051;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class Recipe051 extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bitmap srcBitmap;
srcBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.sample);
Bitmap reflectionBitmap;
reflectionBitmap = createReflectionBitmap(srcBitmap);
LinearLayout layout = new LinearLayout(this);
ImageView imageView01 = new ImageView(this);
imageView01.setImageBitmap(srcBitmap);
layout.addView(imageView01);
ImageView imageView02 = new ImageView(this);
imageView02.setImageBitmap(reflectionBitmap);
layout.addView(imageView02);
setContentView(layout);
}
public static Bitmap createReflectionBitmap(Bitmap src) {
// 元画像と反射画像のマージン
int margin = 4;
int width = src.getWidth();
int height = src.getHeight();
// 上下反転させるMatrix
Matrix matrix = new Matrix();
matrix.preScale(1, -1);
// 元画像の下半分を反転したBitmapを生成
Bitmap reflection;
reflection = Bitmap.createBitmap(src,
0,
height / 2,
width,
height / 2,
matrix,
true);
// 元画像と反射画像が合体した結果画像のBitmapを生成
// これはまだ空っぽ
Bitmap result;
result = Bitmap.createBitmap(width,
height + height / 2,
Config.ARGB_8888);
// キャンバスを使って
Canvas canvas;
canvas = new Canvas(result);
// 結果画像に元画像を書き込む
canvas.drawBitmap(src, 0, 0, null);
// 結果画像に反射画像を書き込む
canvas.drawBitmap(reflection, 0, height + margin, null);
// ここまでで反転画像と合体した状態
// ここからぼかし
Paint paint = new Paint();
// LinearGradientという直線方向のグラデーションを使います。
LinearGradient shader;
// だんだん透明になるグラデーションを作る
// 0x90ffffff(やや透明) -> 0x00FFFFFF(完全透明)
shader = new LinearGradient(0,
height,
0,
result.getHeight() + margin,
0x90ffffff,
0x00ffffff,
TileMode.CLAMP);
// Shaderクラスを継承しているのでsetShaderでPaintにセットします。
paint.setShader(shader);
// 色の変換モードを指定
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
// グラデーションを描画
canvas.drawRect(0, height, width, result.getHeight(), paint);
return result;
}
}