1、Path
public class MyPath extends View {
private int width;
private int height;
private Path mPath;
private Paint mPaint;
private Paint mPaintNew;
private int count = 0;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0x23:
count+=10;
if(count>80){//注意这里的count值要>80
count=0;
}
invalidate();
handler.sendEmptyMessageDelayed(0x23, 20);
break;
}
}
};
public MyPath(Context context) {
super(context);
}
public MyPath(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setTextSize(20);
// mPaint.setStrokeWidth(5);
mPaint.setAntiAlias(true);//去锯齿
mPaintNew = new Paint();
mPaintNew.setColor(Color.RED);
mPaintNew.setStrokeWidth(5);
mPaintNew.setStyle(Paint.Style.STROKE);
mPath = new Path();
handler.sendEmptyMessage(0x23);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//画三角形
mPath.moveTo(100, 100);
mPath.lineTo(0, 200);
mPath.lineTo(200, 200);
mPath.close();
canvas.drawPath(mPath, mPaint);
canvas.drawTextOnPath("在三角形边上写点啥呢", mPath, 50, 20, mPaint);
//画圆
mPath.addCircle(width/2,height/2,300,Path.Direction.CW);
canvas.drawPath(mPath,mPaint);
canvas.drawTextOnPath("在这里我要写点啥呢",mPath,1000,50,mPaint);//1000文字开始写的偏移,50文字相对圆的上下偏移
//画贝塞尔曲线
mPath.moveTo(100,100);//起始点坐标
mPath.quadTo(100, 400, 300, 300);//控制点坐标,结束点坐标
canvas.drawPath(mPath, mPaint);
canvas.drawPoint(100, 100, mPaint);
canvas.drawPoint(100,400,mPaint);
canvas.drawPoint(300,300,mPaint);
//波浪
mPath.reset();
mPath.moveTo(count, 100);
for(int i =0;i<10;i++) {
mPath.rQuadTo(20, 5, 40, 0);//一个完整的波浪长度为80
mPath.rQuadTo(20, -5, 40, 0);
}
canvas.drawPath(mPath, mPaint);
canvas.drawCircle(300, 100, 50, mPaintNew);
}
}
三角形
贝塞尔曲线
圆
2、BitmapView
public class BitmapView extends View {
private int width;
private int height;
private Bitmap mBitmap;
private Paint mPaint;
private Matrix matrix;
private int imageWidth;
private int imageHeight;
public BitmapView(Context context) {
super(context);
}
public BitmapView(Context context, AttributeSet attrs) {
super(context, attrs);
mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.hh);
mPaint = new Paint();
matrix = new Matrix();
imageWidth = mBitmap.getWidth();
imageHeight = mBitmap.getHeight();
Log.d("图片的高: " + mBitmap.getHeight(), "图片的宽: " + mBitmap.getWidth());
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// canvas.drawBitmap(mBitmap,50,100,mPaint);//将图片画入
matrix.reset();
matrix.postScale(2, 2);//x,y轴各放大两倍
canvas.drawBitmap(mBitmap, matrix, mPaint);
matrix.reset();
canvas.drawBitmap(mBitmap, matrix, mPaint);//把原图再画到放大的图片上
matrix.reset();
matrix.postTranslate(0, imageHeight * 2);//平移,x轴不变,y轴向下平移高的两倍
canvas.drawBitmap(mBitmap, matrix, mPaint);
matrix.reset();
matrix.postRotate(90);//旋转180度
matrix.postTranslate(imageWidth * 2, imageHeight * 2);//x,y轴都平移两倍
canvas.drawBitmap(mBitmap, matrix, mPaint);
matrix.reset();
float matrix_values[] = {1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f};//关于x轴对称
matrix.setValues(matrix_values);
matrix.postTranslate(0, imageHeight * 2);
canvas.drawBitmap(mBitmap, matrix, mPaint);
matrix.reset();
float matrix_values2[] = {-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};//关于y轴对称
matrix.setValues(matrix_values2);
matrix.postTranslate(imageWidth * 3, 0);
canvas.drawBitmap(mBitmap, matrix, mPaint);
matrix.reset();
float matrix_values3[] = {1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f};
matrix.setValues(matrix_values3);
matrix.postTranslate(0, imageHeight * 4);
matrix.postTranslate(imageWidth * 2, 0);
matrix.postScale(2, 2,imageWidth*2, imageHeight *3);//以imageWidth*2, imageHeight *3点放大
canvas.drawBitmap(mBitmap, matrix, mPaint);
}
}
处理如下:
public class BitmapView2 extends View {
private int width;
private int height;
private Paint mPaintCircle;
private Paint mPaintRect;
private Bitmap mBitmap;
private Canvas mCanvas;
public BitmapView2(Context context) {
super(context);
}
public BitmapView2(Context context, AttributeSet attrs) {
super(context, attrs);
mPaintCircle = new Paint();
mPaintCircle.setColor(Color.YELLOW);
mPaintRect = new Paint();
mPaintRect.setColor(Color.GREEN);
PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.XOR);//这里可以改变mode来得到不同的效果
mPaintRect.setXfermode(mode);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.GRAY);
mCanvas.drawCircle(width / 2, height / 2, width / 2, mPaintCircle);
mCanvas.drawRect(0, 0, width / 2, height / 2, mPaintRect);
canvas.drawBitmap(mBitmap,0,0,null);
}
}
运行如下:
3、Slider(手机联系人查询)
布局文件
<com.my.administrator.zdyview.MySlider
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/textview"
android:layout_width="100dp"
android:layout_height="100dp"
android:textSize="50dp"
android:layout_centerInParent="true"
android:gravity="center" />
MySlider类继承 View,重写发放,画相应内容
public class MySlider extends View {
private int width;
private int height;
private Paint mPaintText;
private Paint mPaintRed;
private String[] array = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
"o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
private int index = -1;
//设置观察者模式
public interface OnItemSelect {
public void onItemSelected(int index, String s);
}
private OnItemSelect listener;
//添加监听器
public void setOnItemSelectListener(OnItemSelect listener) {
this.listener = listener;
}
public MySlider(Context context) {
super(context);
}
public MySlider(Context context, AttributeSet attrs) {
super(context, attrs);
mPaintText = new Paint();
mPaintText.setTextAlign(Paint.Align.CENTER);
mPaintRed = new Paint();
mPaintRed.setColor(Color.RED);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
mPaintText.setTextSize(height / 26f);//每个字的大小是总宽度除以26个字母
mPaintRed.setTextSize(height / 26f);
}
private float x;
private float y;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_DOWN:
x = event.getX();
y = event.getY();
if (x > width - mPaintText.measureText("m") * 2) {
index = (int) y / (height / 26);
Log.d("onTouch", "点击了字母" + array[index]);
// Toast.makeText(getContext(), "点击了字母" + array[index], Toast.LENGTH_SHORT).show();
if (listener != null) {
listener.onItemSelected(index, array[index]);//调用onItemSelected方法
}
invalidate();
return true;
}
break;
case MotionEvent.ACTION_UP:
index=-1;
invalidate();
return true;
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < array.length; i++) {
if (index == i) {
canvas.drawText("" + array[i], width - mPaintText.measureText("m"), height / 26 * (i + 1), mPaintRed);
} else {
canvas.drawText("" + array[i], width - mPaintText.measureText("m"), height / 26 * (i + 1), mPaintText);
}
}
}
}
在Activity中
private TextView mTextView;
private MySlider mySlider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textview);
mySlider = (MySlider) findViewById(R.id.view);
mySlider.setOnItemSelectListener(new MySlider.OnItemSelect() {//调用监听器
@Override
public void onItemSelected(int index, String s) {//重写onItemSelected方法
mTextView.setText(s);
}
});
触摸到字母时会变红色,同时中间的TextView显示所处的字母