1. 程式人生 > >Android自定義控制元件-----放大鏡

Android自定義控制元件-----放大鏡

public class ShaderView extends View {
	private final Bitmap bitmap;
	private final ShapeDrawable drawable;
	// 放大鏡的半徑

	private static final int RADIUS = 80;
	// 放大倍數

	private static final int FACTOR = 3;
	private final Matrix matrix = new Matrix();

	public ShaderView(Context context) {
		super(context);
		Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.demo);
		bitmap = bmp;
		BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(bmp,
				bmp.getWidth() * FACTOR, bmp.getHeight() * FACTOR, true),
				TileMode.CLAMP, TileMode.CLAMP);
		// 圓形的drawable

		drawable = new ShapeDrawable(new OvalShape());
		drawable.getPaint().setShader(shader);
		drawable.setBounds(0, 0, RADIUS * 2, RADIUS * 2);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		final int x = (int) event.getX();
		final int y = (int) event.getY();
		// 這個位置表示的是,畫shader的起始位置

		matrix.setTranslate(RADIUS - x * FACTOR, RADIUS - y * FACTOR);
		drawable.getPaint().getShader().setLocalMatrix(matrix);
		// bounds,就是那個圓的外切矩形

		drawable.setBounds(x - RADIUS, y - RADIUS, x + RADIUS, y + RADIUS);
		invalidate();
		return true;
	}

	@Override
	public void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		canvas.drawBitmap(bitmap, 0, 0, null);
		drawable.draw(canvas);
	}
}