lerayZhang 2012-07-20
package com.example.android.apis.graphics; import android.app.Activity; import android.content.Context; import android.graphics.*; import android.os.Bundle; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.*; public class Patterns extends GraphicsActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new SampleView(this)); } private static Bitmap makeBitmap1() { Bitmap bm = Bitmap.createBitmap(40, 40, Bitmap.Config.RGB_565); Canvas c = new Canvas(bm); c.drawColor(Color.RED); Paint p = new Paint(); p.setColor(Color.BLUE); c.drawRect(5, 5, 35, 35, p); return bm; } private static Bitmap makeBitmap2() { Bitmap bm = Bitmap.createBitmap(64, 64, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bm); Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); p.setColor(Color.GREEN); p.setAlpha(0xCC); c.drawCircle(32, 32, 27, p); return bm; } private static class SampleView extends View { private final Shader mShader1; private final Shader mShader2; private final Paint mPaint; private final DrawFilter mFastDF; private float mTouchStartX; private float mTouchStartY; private float mTouchCurrX; private float mTouchCurrY; private DrawFilter mDF; public SampleView(Context context) { super(context); setFocusable(true); setFocusableInTouchMode(true); mFastDF = new PaintFlagsDrawFilter(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG, 0);//不方便给画笔加过滤效果的,可以DrawFilter直接作用于canvas, 这里是增强bitmap效果 mShader1 = new BitmapShader(makeBitmap1(), Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);//图形阴影(要填充的图形,X方向填充模式,Y方向填充模式。 mShader2 = new BitmapShader(makeBitmap2(), Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); Matrix m = new Matrix(); m.setRotate(30); mShader2.setLocalMatrix(m);//给shader应用形变 mPaint = new Paint(Paint.FILTER_BITMAP_FLAG); } @Override protected void onDraw(Canvas canvas) { canvas.setDrawFilter(mDF);//给画布增效过滤。 mPaint.setShader(mShader1); canvas.drawPaint(mPaint);//绘制底层方格 canvas.translate(mTouchCurrX - mTouchStartX, mTouchCurrY - mTouchStartY);//移动画布,然后绘制,达到拖动效果 mPaint.setShader(mShader2);//上层圆形 canvas.drawPaint(mPaint); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mTouchStartX = mTouchCurrX = x; mTouchStartY = mTouchCurrY = y; mDF = mFastDF; invalidate(); break; case MotionEvent.ACTION_MOVE: mTouchCurrX = x; mTouchCurrY = y; invalidate(); break; case MotionEvent.ACTION_UP: mDF = null; invalidate(); break; } return true; } } }