问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

自定义view效率高于xml定义吗

发布网友 发布时间:2022-04-23 05:45

我来回答

1个回答

热心网友 时间:2022-04-23 07:14

为了加速视图,从那些调用频繁的活动中减少不必要的代码。在OnDraw()方法中开始绘制,它会给你最大的
效益。特别低,你也应该减少在onDraw()方法中的内存分配,因为任何内存分配都可能导致内存回收,这将会

引起不连贯。 在初始化或者动画之间分配对象。绝不要在动画运行时分配内存。

另一方面需要减少onDraw()方法中的开销,只在需要时才调用onDraw()方法。通常invalidate()方法会调用

onDraw()方法,因此减少对invalidate()的不必要调用。如果可能,调用它的重载版本即带有参数的invalidate()

方法而不是无参的invalidate()方法。该带参数的方法invalidate()能使draw过程更有效,以及减少对落在该矩形

区域(参数指定的区域)外视图的不必要重绘 。

注,invalidate()的三个重载版本为:

1 、public
void invalidate (Rect dirty)
2、public void invalidate (int
l, int t, int r, int b)

3、public void invalidate ()

另外的一个高代价的操作是布局过程(layout)。 任何时刻对View调用requestLayout()方法,Android UI 框架

都需要遍历整个View树,确定每个视图它们所占用的大小。如果在measure过程中有任何冲突,可能会多次遍历

View树。UI设计人员有时为了实现某些效果,创建了较深层次的ViewGroup。但这些深层次View树会引发效率

问题。确保你的View树层次尽可能浅。

如果你有的UI设计是复杂地,你应该考虑设计一个自定义ViewGroup来实现layout过程。不同于内置View控件,

自定义View能够假定它的每个子View的大小以及形状,同时能够避免为每个子View进行measure过程。 PieChart

展示了如何继承ViewGroup类。 PieChart带有子View,但它从来没有measure它们。相反,它根据自己的布局算法

去直接设置每个子View的大小。

如下代码所示:

[java] view plaincopyprint?
/**
* Custom view that shows a pie chart and, optionally, a label.
*/
public class PieChart extends ViewGroup {
...
//
// Measurement functions. This example uses a simple heuristic: it assumes that
// the pie chart should be at least as wide as its label.
//
@Override
protected int getSuggestedMinimumWidth() {
return (int) mTextWidth * 2;
}
@Override
protected int getSuggestedMinimumHeight() {
return (int) mTextWidth;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Try for a width based on our minimum
int minw = getPaddingLeft() + getPaddingRight() + getSuggestedMinimumWidth();

int w = Math.max(minw, MeasureSpec.getSize(widthMeasureSpec));

// Whatever the width ends up being, ask for a height that would let the pie
// get as big as it can
int minh = (w - (int) mTextWidth) + getPaddingBottom() + getPaddingTop();
int h = Math.min(MeasureSpec.getSize(heightMeasureSpec), minh);

setMeasuredDimension(w, h);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// Do nothing. Do not call the superclass method--that would start a layout pass
// on this view's children. PieChart lays out its children in onSizeChanged().
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);

//
// Set dimensions for text, pie chart, etc
//
// Account for padding

...

// Lay out the child view that actually draws the pie.
mPieView.layout((int) mPieBounds.left,
(int) mPieBounds.top,
(int) mPieBounds.right,
(int) mPieBounds.bottom);
mPieView.setPivot(mPieBounds.width() / 2, mPieBounds.height() / 2);

mPointerView.layout(0, 0, w, h);
onDataChanged();
}

}

使用硬件加速

Android 3.0版本后,Android 2D图形库能在大多数Android设备上使用GPU(图形处理单元)加速。GPU硬件
加速可以极大的优化多数应用程序,但它并不是每个应用程序的最优选择。Android框架给予你是否在应用程序中

使用硬件加速的控制力。

<<如何运用硬件加速>>篇展示了如何在Application、Activity、Window级别中使用硬件加速。值得注意的是

我们必须手动在配置文件中设置应用程序API级别为11或者更高级别,即在 AndroidManifest.xml进行如下配置:
<uses-sdk android:targetSdkVersion="11"/>

一旦你开启了硬件加速,你可能看不到效率的提升。Mobile GPUs 善于处理特定的任务,例如:伸缩、旋转、

平移图片。它也有一些不擅长处理的任务,例如:绘制直线或曲线。常言道物尽其用,扬长避短,尽可能让GPU

处理它擅长的任务,减少让其处理弱势任务的。

在PieChart 示例中,例如,相对来说绘制一个圆形是比较耗费资源的。每次旋转引起的重绘导致UI的迟缓。

解决办法就是让View来呈现该圆形,并且设置该View的layer type属性为 LAYER_TYPE_HARDWARE,因此GPU

能够缓存静态图片。示例中该View作为 PieChart类的内部类存在,减少了为了实现这个方法的代码开销。

[java] view plaincopyprint?
private class PieView extends View {

public PieView(Context context) {
super(context);
if (!isInEditMode()) {
setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

for (Item it : mData) {
mPiePaint.setShader(it.mShader);
canvas.drawArc(mBounds,
360 - it.mEndAngle,
it.mEndAngle - it.mStartAngle,
true, mPiePaint);
}
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mBounds = new RectF(0, 0, w, h);
}

RectF mBounds;
}

改变之后,只有View第一次显示的时候才会调用PieChart.PieView.onDraw()方法。在应用程序的其他
时间,绘制的图像将会作为图片缓存,重绘时GPU将任意旋转图像。

然而这只是一个折中手段。缓存图片作为硬件层导致 video memory开销,video memory却是一种受*的

资源。 出于这个原因,在PieChart.PieView的最终版本上,只有在用户滑动时才设置它的layer type属性为

LAYER_TYPE_HARDWARE。在其他时间,仅仅设置它的layer type属性为 LAYER_TYPE_HARDWARE,这

允许GPU停止缓存图片。

最后,不要忘记分析你的代码。在一个View上做的优化技术可能会在其他View上产生不好的影响。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
陌陌发语音出现转码失败怎么办 女孩2010年5月10号阴历3月27早晨9点55分出生的五行缺什么 钟姓男孩名字2023年5月10日出生的 凤眼果有什么营养?凤眼果的这些营养你都知道吗? 专升本成绩多少合格 山东专升本成绩多少合格 山东2022年专升本成绩什么时候出 2024专升本成绩公布时间及入口 2023年山东专升本各专业录取分数线 什么时候出专升本成绩 山东专升本综合素质测评成绩怎么算 《盲宠》txt下载在线阅读全文,求百度网盘云资源 求 银河护卫队1 的国语版 百度云资源 求pg1 破釜沉舟 中二病 英雄归来 万磁王 百度云资源 请问有《指令227:破釜沉舟》英文免安装版游戏免费百度云资源吗 《破釜沉舟心理追凶》pdf下载在线阅读全文,求百度网盘云资源 包子做法,包子技术培训,饺子怎么做 哪位大神有破釜沉舟2012年上映的由 安德鲁·布劳尔主演的百度云资源 新生儿睡觉只能抱着怎么回事 家里人想学包子和饺子,在当地开一家小店,有没有学校可以自己挑选学习的品种? 宝宝为什么抱着睡得香,放下就醒? 新生儿为何总是抱着能睡,放床上就醒?原因出在哪里? 手机内存卡被写保护,怎么去掉? 手机TF内存卡被写保护,里面的资料无法删除和复制了,怎么解除呢? 如接网线到设备路由器的好坏就不重要了是吗?? 正宗陕西凉皮调料水怎么做 陕西凉皮调料水怎么做 乳房下方会疼痛是什么原因? 请问描写胡萝卜形状的词语丶句子. 调用高德地图API的ajax怎么写 宣传高德地图软文怎么写 一般什么地方有打耳洞的呢 哪里可以打耳洞啊?什么店?? 请问常州哪里有打耳洞的地方吗 哪里可以打耳洞 哪有打耳洞的地方 长沙那些地方可以打耳洞? 桂林哪里有打耳洞的地方??? 城那里可以打耳洞 在哪里可以打耳洞 哪里有打耳洞的地方? 为什么电脑在QQ对话框有时候打不出字呢? 其他的聊天对话框也打不出字? 在我的电脑上我的QQ为什么打不上字,别人的都能打上 吴彦祖拍激情戏是真的吗 谢霆锋 吴彦祖 刘德华 主演的电影中哪些有激情戏啊 最激情的吻戏是哪部?吴彦祖和何美燕的吻戏在哪? 吴彦祖为妻子庆生,自述无性婚姻已十年,无性婚姻对彼此有多大影响? 吴彦祖为妻子庆祝生日,自曝无性婚姻十年,无性婚姻对夫妻感情有多大影响? - 信息提示 何美铀吴彦祖门徒激情是在多少分钟那 天龙八部里的杜康祠在那啊