package com.mcxtzhang.cstviewdemo.shader;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.mcxtzhang.cstviewdemo.R;
public class BrickView extends View {
private Paint mFillPaint, mStrokePaint;// 填充和描边的画笔
private BitmapShader mBitmapShader;// Bitmap着色器
private float posX, posY;// 触摸点的XY坐标
public BrickView(Context context, AttributeSet attrs) {
super(context, attrs);
// 初始化画笔
initPaint();
}
/**
* 初始化画笔
*/
private void initPaint() {
/*
* 实例化描边画笔并设置参数
*/
mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
mStrokePaint.setColor(0xFF000000);
mStrokePaint.setStyle(Paint.Style.STROKE);
mStrokePaint.setStrokeWidth(5);
// 实例化填充画笔
mFillPaint = new Paint();
/*
* 生成BitmapShader
*/
Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.flower);
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
mFillPaint.setShader(mBitmapShader);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
/*
* 手指移动时获取触摸点坐标并刷新视图
*/
if (event.getAction() == MotionEvent.ACTION_MOVE) {
posX = event.getRawX();
posY = event.getRawY();
invalidate();
}
return true;
}
@Override
protected void onDraw(Canvas canvas) {
// 设置画笔背景色
canvas.drawColor(Color.DKGRAY);
Bitmap b1 = BitmapFactory.decodeResource(getResources(), R.drawable.flower);
BitmapShader bs1 = new BitmapShader(b1, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
Paint p1 = new Paint();;
p1.setShader(bs1);
canvas.drawRect(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom(), p1);
/*
* 绘制圆和描边
*/
canvas.save();
canvas.translate(posX,posY);
/* float scale = 1.2f;
canvas.scale(scale, scale);*/
Bitmap b2 = BitmapFactory.decodeResource(getResources(), R.drawable.flower);
BitmapShader bm2 = new BitmapShader(b2, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
// ▼ 获得当前矩阵的逆矩阵
Matrix invertMatrix = new Matrix();
canvas.getMatrix().invert(invertMatrix);
bm2.setLocalMatrix(invertMatrix);
Paint p2 = new Paint();
p2.setShader(bm2);
canvas.drawCircle(0,0,300,p2);
canvas.drawCircle(0,0,300,mStrokePaint);
canvas.restore();
/*
float[] pts = {posX, posY};
//invertMatrix.mapPoints(pts);
canvas.drawCircle(pts[0]/scale, pts[1]/scale, 300, mFillPaint);
canvas.drawCircle(pts[0]/scale, pts[1]/scale, 300, mStrokePaint);*/
}
}