http://chroya.iteye.com/blog/924577
快三个月了没写博客了,因为工作调动,很多经验、心得都没有时间记录下来。现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上。进入正题。
- package
chroya.demo.magnifier; -
- import
android.content.Context; - import
android.graphics.Bitmap; - import
android.graphics.BitmapFactory; - import
android.graphics.BitmapShader; - import
android.graphics.Canvas; - import
android.graphics.Matrix; - import
android.graphics.Shader.TileMode; - import
android.graphics.drawable.ShapeDrawable; - import
android.graphics.drawable.shapes.OvalShape; - import
android.view.MotionEvent; - import
android.view.View; -
-
- public
class ShaderView extends View{ -
private Bitmap bitmap; -
private ShapeDrawable drawable; -
//放大镜的半径 -
private static final int RADIUS = 80; -
//放大倍数 -
private static final int FACTOR = 3; -
private Matrix matrix = new Matrix(); -
-
public ShaderView(Context context) { -
super(context); -
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.show); -
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); -
} - }
- package
chroya.demo.magnifier; -
- import
android.content.Context; - import
android.graphics.Bitmap; - import
android.graphics.BitmapFactory; - import
android.graphics.Canvas; - import
android.graphics.Matrix; - import
android.graphics.Path; - import
android.graphics.Path.Direction; - import
android.view.MotionEvent; - import
android.view.View; -
-
- public
class PathView extends View{ -
private Path mPath = new Path(); -
private Matrix matrix = new Matrix(); -
private Bitmap bitmap; -
//放大镜的半径 -
private static final int RADIUS = 80; -
//放大倍数 -
private static final int FACTOR = 2; -
private int mCurrentX, mCurrentY; -
-
public PathView(Context context) { -
super(context); -
mPath.addCircle(RADIUS, RADIUS, RADIUS, Direction.CW); -
matrix.setScale(FACTOR, FACTOR); -
-
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.show); -
} -
-
@Override -
public boolean onTouchEvent(MotionEvent event) { -
mCurrentX = (int) event.getX(); -
mCurrentY = (int) event.getY(); -
-
invalidate(); -
return true; -
} -
-
@Override -
public void onDraw(Canvas canvas) { -
super.onDraw(canvas); -
//底图 -
canvas.drawBitmap(bitmap, 0, 0, null); -
//剪切 -
canvas.translate(mCurrentX - RADIUS, mCurrentY - RADIUS); -
canvas.clipPath(mPath); -
//画放大后的图 -
canvas.translate(RADIUS-mCurrentX*FACTOR, RADIUS-mCurrentY*FACTOR); -
canvas.drawBitmap(bitmap, matrix, null); -
} - }