效果图
Java源码
public class MyView extends View {
private Bitmap bitmap; // 源图像,也就是背景图像
private ShapeDrawable drawable;
private final int RADIUS = 57; // 探照灯的半径
private Matrix matrix = new Matrix();
public MyView(Context context) {
super(context);
Bitmap bitmap_source = BitmapFactory.decodeResource(getResources(),
R.drawable.source); //获取要显示的源图像
bitmap = bitmap_source;
//创建BitmapShader对象,以整张图片为底色图片
BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(
bitmap_source, bitmap_source.getWidth(),
bitmap_source.getHeight(), true), TileMode.CLAMP,
TileMode.CLAMP);
// 圆形的drawable
drawable = new ShapeDrawable(new OvalShape());
drawable.getPaint().setShader(shader);
// 设置圆的外切矩形,抠出(0, 0, RADIUS * 2, RADIUS * 2)这个位置的圆形图片
drawable.setBounds(0, 0, RADIUS * 2, RADIUS * 2);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint p=new Paint();
p.setAlpha(50);
canvas.drawBitmap(bitmap, 0,0, p); // 绘制背景图像
drawable.draw(canvas); // 绘制探照灯照射的图像
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// 获取当前触摸点的X轴坐标
final int x = (int) event.getX();
// 获取当前触摸点的Y轴坐标
final int y = (int) event.getY();
// 平移到绘制shader的起始位置
matrix.setTranslate(RADIUS - x , RADIUS - y );
drawable.getPaint().getShader().setLocalMatrix(matrix);
// 设置圆的外切矩形
drawable.setBounds(x - RADIUS, y - RADIUS, x + RADIUS, y + RADIUS);
invalidate(); // 重绘画布
return true;
}
}