自定义view
使用用自定View可以使View更加灵活,效果更炫,实现的功能也比较多
一、 如何实现自定义View?
- 继承一个现有的View,比如Button
- 完全自定义View
- 组合现有的View
二、
1.继承Button的View
public class MyButton_drawXX extends Button {
//画笔
private Paint paint;
//路径
private Path path;
//图片
private Bitmap bitmap;
//如果直接使用代码创建对象,实现该方法
public MyButton_drawXX(Context context) {
super(context);
init();
}
//布局中使用,实现该方法
public MyButton_drawXX(Context context, AttributeSet set) {
super(context, set);
init();
}
public void init() {
paint = new Paint();
// 设置画笔不填充
paint.setStyle(Style.STROKE);
// 抗锯齿, 会消耗资源
paint.setAntiAlias(true);
//画笔颜色
// paint.setColor(Color.RED);
path = new Path();
//创建Bitmap的两种方法
// bitmap = ((BitmapDrawable) this.getResources().getDrawable(
// R.drawable.ic_launcher)).getBitmap();
bitmap = BitmapFactory.decodeResource(this.getResources(),
R.drawable.ic_launcher);
}
// 直线 矩形 圆 自由路径 文字 图片 弧线
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 画直线
canvas.drawLine(0, 0, 100, 200, paint);
// 画矩形
canvas.drawRect(50, 200, 100, 100, paint);
// 左上角的坐标是(150,75),右下角的坐标是(260,120)
Rect rect = new Rect(150, 75, 260, 120);
canvas.drawRect(rect, paint);
paint.setColor(Color.RED);
RectF rectF = new RectF(100, 200, 200, 400);
canvas.drawRect(rectF, paint);
// 画内切圆
// canvas.drawOval(rectF, paint);
// 自由路径
path.moveTo(120, 120);
path.lineTo(223, 245);
path.lineTo(120, 245);
path.close();
canvas.drawPath(path, paint);
// 文字 以字符串的左下为位置的开始计算的
canvas.drawText("这是一串字符串", 300, 250, paint);
// 画图1
canvas.drawBitmap(bitmap, 0, 0, paint);
// 画图2
// Rect src: 是对图片进行裁截,若是空null则显示整个图片
// RectF dst:是图片在Canvas画布中显示的区域,
// 大于src则把src的裁截区放大,
// 小于src则把src的裁截区缩小
Rect src = new Rect(0, 24, 48, 48);
RectF dst = new RectF(0, 0, 100, 100);
canvas.drawBitmap(bitmap, src, dst, paint);
// 画弧线
canvas.drawArc(rectF, 0, 90, false, paint);
}
}
2、完全自定义View,是继承View来实现,其他的使用方法与继承现有的View相似
比如Paint、Path、onDraw方法、canvas、构造方法
以下代码实现画图板功能:
public class MyView extends View {
private float x;
private float y;
private Paint paint=new Paint();
private Path path=new Path();
public MyView(Context context) {
super(context);
paint.setStyle(Style.STROKE);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(path, paint);
}
//在View的内部添加事件监听
@Override
public boolean onTouchEvent(MotionEvent event) {
x = event.getX();
y = event.getY();
if (event.getAction() != MotionEvent.ACTION_DOWN) {
path.lineTo(x, y);
}else{
path.moveTo(x, y);
}
//重画
invalidate();
System.out.println(x+"================="+y);
return true;
}
}
3、自定义View--组合现有的View
public class MyRelativeLayout extends RelativeLayout {
//因为在布局文件中使用该对象,选2个参数的构造
public MyRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
//更具命名空间、属性名获取属性值
String value = attrs.getAttributeValue("http://www.baidu.com"," orientation");
System.out.println("-----------------"+value);
if("horizontal".equals(value)){
View.inflate(context, R.layout.my_relative_layout_horizontal, this);
}else if("verticality".equals(value)){
View.inflate(context, R.layout.my_relative_layout_verticality, this);
}else{
throw new RuntimeException("Error..orientation.. ..verticality...horizontal");
}
}
}