Android开发之自定义视图

时间:2021-08-16 22:11:02

继承View

1.重写onMeasure(int wMeasureSpec,int hMeasureSpec)处理程序,这样可以标明视图尺寸

2.重写onDraw,以便绘制我们自己的自定义视图内

3.在onMeasure方法中解码传入的参数

int hSpecMode = MeasureSpec.getMode(hMeasureSpec);

int hSpecSize = MeasureSpec.getSize(hMeasureSpec);

int myHeight = hSpecSize;

4.使用已解码的模式参数来查找我们应该设置的视图大小

if(hSpecMode == MeasureSpec.EXACTLY)

myHeight = hSpecSize;        //返回视图的模式正好,视图会被放入一个大小完全相符的区域内,视图布局指定了特定大小,或如果要求视图填充父视图,就会将该值传递给你

else if(hSpecMode == MeasureSpec.AT_MOST)

//Wrap Content        //AT_MOST表示只要不超过给出的最大尺寸,即可为视图定义自己的尺寸

//Repeat for Width

setMeasuredDimension(myWidth,myHeight);

5.在onDraw方法的自定义视图上进行

示例代码

private void init() {

mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mTextPaint.setColor(mTextColor);

if (mTextHeight == 0) {

mTextHeight = mTextPaint.getTextSize();

} else {

mTextPaint.setTextSize(mTextHeight);

}

mPiePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mPiePaint.setStyle(Paint.Style.FILL);

mPiePaint.setTextSize(mTextHeight);

mShadowPaint = new Paint(0);

mShadowPaint.setColor(0xff101010);

mShadowPaint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL));

...

任何在onDraw方法中创建的对象,包括画笔对象,都会以非常高的频率创建并破坏,这回影响UI流畅性

解决方案:就是将onDraw中需要的对象扩大其作用范围,移动到该方法外面

6.如何将自定义视图添加到布局,使其在xml中的完整包名和类名

<wp.MyView

android:height = "..."

android:width = "..."

/>

对于不控制自身值的通用视图

最简单的备用方法是运行时在应用中设置内容描述

myView.setContentDescription(contentDescription);

一种更为强大的解决方案是只要可视内容被修改,就从你的视图中,发送辅助功能事件

AccessibilityManager accessibilityManager =

(AccessibilityManager) context.getSystemService(

Context.ACCESSIBILITY_SERVICE);

if (accessibilityManager.isEnabled()) {

sendAccessibilityEvent(

AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);

}

然后覆盖dispatchPopulateAccessibilityEvent(AccessibilityEvent ev){

ev.getText().add(windSpeedDir);

return true;

}