码迷,mamicode.com
首页 > 移动开发 > 详细

初学_Android4高级编程-3 自定义View

时间:2015-07-06 19:39:11      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

※创建自定义控件
1.修改现有视图,继承android自带控件,扩展自带控件来定制其外观和行为。
2.直接继承View,SurfaceView类,在一个空画布上创建新的控件

由于效率问题,在自定义的构造函数中完成画刷的创建。
public MyTextVIew(Context context) {
super(context);
Resources resources = getResources();
marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
marginPaint.setColor(resources.getColor(R.color.notepad_margin));
linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
linePaint.setColor(resources.getColor(R.color.notepad_lines));
paperColor = resources.getColor(R.color.notepad_pager);
margin = resources.getDimension(R.dimen.notepad_margin);
}

重写onDraw方法修改视图的外观。
@Override
protected void onDraw(Canvas canvas) {
//绘制视图背景色
canvas.drawColor(paperColor);
//绘制边缘
canvas.drawLine(0,0,0,getMeasuredHeight(),linePaint);
canvas.drawLine(0,getMeasuredHeight(),getMeasuredWidth(),getMeasuredHeight(),linePaint);
//绘制marginLeft = margin的竖直线。
canvas.drawLine(margin,0,margin,getMeasuredHeight(),marginPaint);
//Saves the current matrix and clip onto a private stack.
//canvas.save();
//Preconcat the current matrix with the specified translation
canvas.translate(margin,0);
super.onDraw(canvas);
//canvas.restore();
}

当控件的父容器布局它的子控件时,调用onMeasure方法,除非要求恰好占据100*100像素,否则将需要重写。
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){
//返回高度,宽度
int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(heightMeasureSpec);
setMeasuredDimension(measuredHeight,measuredWidth);
}

在创建复合布局(extends LinearLayout)的时候,在构造函数中使用LayoutInflate填充布局
资源。

视图的输入事件处理
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
return super.onKeyUp(keyCode, event);
}
@Override
public boolean onTrackballEvent(MotionEvent event) {
return super.onTrackballEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}

自定义罗盘的初始化
private void init() {
setFocusable(true);
Resources r = this.getResources();
circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
circlePaint.setColor(r.getColor(R.color.background_color));
circlePaint.setStrokeWidth(1);
circlePaint.setStyle(Paint.Style.FILL_AND_STROKE);

textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setColor(r.getColor(R.color.text_color));
textPaint.setTextSize(40);

textHeight = (int) textPaint.measureText("yY");

marketPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
marketPaint.setColor(r.getColor(R.color.marker_color));
}
自定义罗盘的视图绘制
@Override
protected void onDraw(Canvas canvas) {
int mMeasureWidth = getMeasuredWidth();
int mMeasureHeight = getMeasuredHeight();
int px = mMeasureWidth / 2;
int py = mMeasureHeight / 2;
int r = Math.min(px, py);

canvas.drawCircle(px, py, r, circlePaint);
canvas.save();
canvas.rotate(-bearing, px, py);

int textWidth = (int) textPaint.measureText("W");
int cardinalX = px - textWidth / 2;
int cardinalY = py - r + textHeight;

for (int i = 0; i < 24; i++) {
canvas.drawLine(px, py - r, px, py - r + 25, marketPaint);
canvas.save();
canvas.translate(0, textHeight);
if (i % 6 == 0) {
String dirString = "";
switch (i) {
case (0):
dirString = "N";
int arrowY = 2 * textHeight;
canvas.drawLine(px, arrowY, px - 5, 3 * textHeight, marketPaint);
canvas.drawLine(px, arrowY, px + 5, 3 * textHeight, marketPaint);
break;
case 6:
dirString = "E";
break;
case 12:
dirString = "S";
break;
case 18:
dirString = "W";
break;
}
canvas.drawText(dirString, cardinalX, cardinalY, textPaint);
} else if (i % 3 == 0) {
String angle = String.valueOf(i * 15);
float angleTextWidth = textPaint.measureText(angle);
int angleTextX = (int) (px - angleTextWidth / 2);
int angleTextY = py - r + textHeight;
canvas.drawText(angle, angleTextX, angleTextY, textPaint);
}
canvas.restore();
canvas.rotate(15, px, py);
}
canvas.restore();
}
自定义罗盘的直径测量
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measuredWidth = measure(widthMeasureSpec);
int measuredHeight = measure(heightMeasureSpec);
int d = Math.min(measuredHeight, measuredWidth);
setMeasuredDimension(d, d);
}
private int measure(int measureSpec) {
int result;

//对测量说明进行解码
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);

//没有指定界限
if (specMode == MeasureSpec.UNSPECIFIED) {
result = 200;
} else {
result = specSize;
}
return result;
}

初始指向
@Override
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
super.dispatchPopulateAccessibilityEvent(event);
if (isShown()) {
String bearingStr = String.valueOf(bearing);
if (bearingStr.length() > AccessibilityEvent.MAX_TEXT_LENGTH) {
bearingStr = bearingStr.substring(0, AccessibilityEvent.MAX_TEXT_LENGTH);
}
event.getText().add(bearingStr);
return true;
} else {
return false;
}
}

初学_Android4高级编程-3 自定义View

标签:

原文地址:http://www.cnblogs.com/waiting-light/p/4625130.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!