在android的xml布局中,几百上千行的xml文件是常事。布局文件的增大一定程度上增加了视图编写的复杂度,而且如果视图的嵌套越深android在加载视图时的性能也会越差,甚至会出现一些低端设备内存不足而崩溃等奇异情况。
对性能要求比较高或适配终端机型广泛的应用,通过编写自定视图控件来优化应用是常用的方式。今天我实现一个类似appstore的更新应用个数提醒的实例,来探讨自画视图的应用场合。
或许很多人一看到上图就会想到用FrameLayout来实现,但一个复杂的视图想添加这种功能往往会非常复杂或有很多的顾虑,而且framelayout的过多使用又会陷入优化的陷阱。所以我用一个折中而且比较保险的方法,最小的修改视图布局结合自绘方式来实现这种功能。下面是最终截图
5个底部tab通过RadioGroup结合RadioButton来实现,如果您不清楚怎么实现该视图请参阅《RadioGroup&RadioButton小技巧 》。红圆和数字"8"通过继承RadioGroup的类MyRadioGroup
重载dispatchDraw方法绘制,再用MyRadioGroup 替换布局里的RadioGroup。为什么重载的不是onDraw而是dispatchDraw呢?下面先来看看dispatchDraw的描述
Called by draw to draw the child views. This may be overridden by derived classes to gain control just before its children are drawn (but after its own view has been drawn).
在onDraw绘制您画的元素在原布局元素的下面,而我们是想把自己画的元素覆盖在原布局元素的上面,所以得用dispatchDraw。好了一些思路讲完了上代码
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.RadioGroup;
/**
* 转载请注明 http://hemowolf.iteye.com
*/
public class MyRadioGroup extends RadioGroup {
Drawable mBg;
Paint mPaintText;
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (mBg == null) mBg = getResources().getDrawable(R.drawable.tab_unread_bg);
if(mPaintText==null){
mPaintText=new Paint();
mPaintText.setTextSize(18f);
mPaintText.setColor(Color.WHITE);
mPaintText.setFakeBoldText(true);
}
//获取字体所占宽度和高度
String text="8";
Rect rect= new Rect();
mPaintText.getTextBounds(text, 0, text.length(), rect);
int textWidth = rect.width(), textHeight = rect.height();
int bgWidth = textWidth+30 > mBg.getIntrinsicWidth() ? textWidth +30: mBg.getIntrinsicWidth()
, bgHeight = textHeight > mBg.getIntrinsicHeight() ? textHeight : mBg.getIntrinsicHeight();
int bgX = this.getWidth() + this.getPaddingLeft() - bgWidth
,bgY = this.getPaddingTop();
mBg.setBounds(bgX, bgY, bgX + bgWidth, bgY + bgHeight);
mBg.draw(canvas);
int x = bgX + (bgWidth - textWidth) / 2 - rect.left, y = bgY + (bgHeight - textHeight) / 2 - rect.top;
canvas.drawText(text, x, y, mPaintText);
}
public MyRadioGroup(Context context) {
super(context);
}
public MyRadioGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
详细的实现请参考实例。
分享到:
相关推荐
DISPATCH
异步和同步的栅栏函数都有以下特点: 1、通过dispatch_barrier_(a)sync添加的block会等待前边所有的block执行完(不包括回调)才执行。 2、在其后添加的block会在dispatch_barrier_(a)sync添加的block执行完之后...
Dispatch IDS for IExplorer Dispatch Events
以上两种方式都是模拟任务block内为异步操作的情况,方式一先执行的dispatch_group_notify里的代码,后执行的dispatch_group_async里的任务代码,这与我们的初衷相违背。如果任务block内为同步操作时,则无论哪种...
connectify dispatch 4.0完美破解版
双击“Installer”安装Connectify Dispatch...复制Crack目录中的dispatch.dll和web文件夹到软件安装目录中的\plugins\dispatch目录覆盖同名文件。 复制Crack目录中的connectify.exe文件到安装程序目录覆盖同名文件。
关于grasshopper的基础练习,dispatch案例的电池资源。
通过它你可以将不同的宽带连接在一起,就好象把几根不同的绳子拧在一起,以获得更坚固的效果,和绳子不同的是,它可以给更快的网速,这个对于蹭网用户绝对是一款不可多得的好工具,实际效果如何,需要各位自行测试了...
Connectify Dispatch Incl. Hotspot Pro. Multiple Connections, Maximum Speed For the first time, you can connect to the coffee shop Wi-Fi and your 4G mobile device simultaneously, using both Internet...
ios demo,dispatch_async,DISPATCH_QUEUE_CONCURRENT,多任务并发执行,自动创建多线
spark-dispatch.zip
Connectify V4.2 with dispatch破解版,内附英文版说明,安装前必看。
Connectify Dispatch Hotspot Pro v4.0 破解版(Crack) Connectify 的又一款好软件,他能够让你所链接的网络叠加复用,达到最高速的上网速度。比如你的电脑连接一条网线,并且一个手机连接着CMCC 并且开启热点连到你...
两种方式都是模拟任务block内为异步操作的情况,方式一先执行的dispatch_group_notify里的代码,后执行的dispatch_group_async里的任务代码,这与我们的初衷相违背。如果任务block内为同步操作时,则无论哪种方式都...
dispatch_apply,dispatch_group,dispatch_barrier,dispatch_source的示例.
关于dispatch_source 浅析
solidworks PDM Dispatch guide与实例,实例是配置文件,可直接加载
前端项目-d3-dispatch,注册命名回调并用参数调用它们。
economic dispatch (lossless)