dispatch自画和XML布局双剑合璧

4 篇文章 0 订阅

转自:http://droidwolf.iteye.com/blog/1356416


 在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。好了一些思路讲完了上代码

Java代码   收藏代码
  1. import android.content.Context;  
  2. import android.graphics.Canvas;  
  3. import android.graphics.Color;  
  4. import android.graphics.Paint;  
  5. import android.graphics.Rect;  
  6. import android.graphics.drawable.Drawable;  
  7. import android.util.AttributeSet;  
  8. import android.widget.RadioGroup;  
  9.   
  10. /** 
  11.  * 转载请注明  http://hemowolf.iteye.com 
  12.  */  
  13. public class MyRadioGroup extends RadioGroup {  
  14.     Drawable mBg;  
  15.     Paint mPaintText;  
  16.     @Override  
  17.     protected void dispatchDraw(Canvas canvas) {  
  18.     super.dispatchDraw(canvas);  
  19.       
  20.     if (mBg == null)   mBg = getResources().getDrawable(R.drawable.tab_unread_bg);  
  21.       
  22.     if(mPaintText==null){  
  23.         mPaintText=new Paint();  
  24.         mPaintText.setTextSize(18f);  
  25.         mPaintText.setColor(Color.WHITE);  
  26.         mPaintText.setFakeBoldText(true);  
  27.     }  
  28.       
  29.     //获取字体所占宽度和高度  
  30.     String text="8";  
  31.     Rect rect= new Rect();  
  32.     mPaintText.getTextBounds(text, 0, text.length(), rect);  
  33.     int textWidth = rect.width(), textHeight = rect.height();  
  34.       
  35.     int bgWidth = textWidth+30 > mBg.getIntrinsicWidth() ? textWidth +30: mBg.getIntrinsicWidth()  
  36.         , bgHeight = textHeight > mBg.getIntrinsicHeight() ? textHeight : mBg.getIntrinsicHeight();  
  37.       
  38.     int bgX = this.getWidth() + this.getPaddingLeft() - bgWidth  
  39.         ,bgY = this.getPaddingTop();  
  40.     mBg.setBounds(bgX, bgY, bgX + bgWidth, bgY + bgHeight);  
  41.     mBg.draw(canvas);  
  42.   
  43.     int x = bgX + (bgWidth - textWidth) / 2 - rect.left, y = bgY + (bgHeight - textHeight) / 2 - rect.top;  
  44.     canvas.drawText(text, x, y, mPaintText);  
  45.     }  
  46.   
  47.     public MyRadioGroup(Context context) {  
  48.     super(context);  
  49.     }  
  50.     public MyRadioGroup(Context context, AttributeSet attrs) {  
  51.     super(context, attrs);  
  52.     }  
  53.   
  54. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值