`
hemowolf
  • 浏览: 154120 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

dispatch自画和XML布局双剑合璧

阅读更多

   在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_barrier_(a)sync

    异步和同步的栅栏函数都有以下特点: 1、通过dispatch_barrier_(a)sync添加的block会等待前边所有的block执行完(不包括回调)才执行。 2、在其后添加的block会在dispatch_barrier_(a)sync添加的block执行完之后...

    Dispatch IDS for IExplorer Dispatch Events

    Dispatch IDS for IExplorer Dispatch Events

    Connectify Dispatch Hotspot Pro

    双击“Installer”安装Connectify Dispatch...复制Crack目录中的dispatch.dll和web文件夹到软件安装目录中的\plugins\dispatch目录覆盖同名文件。 复制Crack目录中的connectify.exe文件到安装程序目录覆盖同名文件。

    DISPATCH

    "DISPATCH"是一个与字体相关的主题,这通常指的是在计算机领域中处理文本显示、排版或文字渲染的技术。在IT行业中,字体是决定文本视觉效果的关键因素,涉及到文本的样式、大小、形状以及在屏幕或打印上的表现。...

    ios demo,dispatch_async,DISPATCH_QUEUE_CONCURRENT,多任务并发执行,自动创建多线程

    压缩包中的`test_gcd_thread_asynchronous_concurrent`可能是一个测试项目,包含了一些用于演示`dispatch_async`和`DISPATCH_QUEUE_CONCURRENT`使用的代码文件。在这个项目中,开发者可能可以看到如何创建并行队列、...

    dispatch_group包含wait

    以上两种方式都是模拟任务block内为异步操作的情况,方式一先执行的dispatch_group_notify里的代码,后执行的dispatch_group_async里的任务代码,这与我们的初衷相违背。如果任务block内为同步操作时,则无论哪种...

    connectify dispatch 4.0完美破解版

    connectify dispatch 4.0完美破解版

    dispatch_source

    `dispatch_source_set_data()`和`dispatch_source_get_data()`允许我们设置和获取数据源的数据值,用于实现自定义的数据过滤和同步机制。 7. **挂起与恢复** 可以使用`dispatch_suspend()`和`dispatch_resume()`...

    Swift-dispatch-semaphore

    Swift中的`DispatchSemaphore`是GCD(Grand Central Dispatch)的一部分,它是Apple的多线程和并发解决方案。在iOS开发中,理解并熟练使用`DispatchSemaphore`对于优化代码性能和处理同步问题至关重要。本文将深入...

    grasshopper电池-dispatch案例

    关于grasshopper的基础练习,dispatch案例的电池资源。

    gcdTest下载图片 dispatch_async

    标题中的“gcdTest下载图片 dispatch_async”涉及到两个主要的iOS编程概念:GCD(Grand Central Dispatch)和异步图像下载。GCD是苹果为多核处理器优化并发编程提供的一种技术,而dispatch_async函数是GCD中用于在...

    Connectify Dispatch(网速叠加软件)4.0注册版.zip

    通过它你可以将不同的宽带连接在一起,就好象把几根不同的绳子拧在一起,以获得更坚固的效果,和绳子不同的是,它可以给更快的网速,这个对于蹭网用户绝对是一款不可多得的好工具,实际效果如何,需要各位自行测试了...

    前端项目-d3-dispatch.zip

    Dispatch在D3中是用来注册命名回调函数,并且能够传递参数调用这些函数,这对于处理事件和数据更新具有重要意义。 D3 dispatch 是一个事件调度系统,允许我们自定义事件和监听器,这在构建复杂的可复用组件时非常...

    StrangeIOC使用讲解(Dispatch用法)

    在 StrangeIOCTest 文件中,你应该能看到如何设置和使用Dispatch的示例代码,包括Dispatch的实现、注册、事件触发以及与View、Controller和Model的交互等。 总的来说,StrangeIOC结合Dispatch提供了强大的组件化...

    Connectify V4.2 with dispatch破解版

    Connectify V4.2 with dispatch破解版,内附英文版说明,安装前必看。

    ios-dispatch的简单demo.zip

    在iOS开发中,GCD(Grand Central Dispatch)是苹果提供的一种多线程解决方案,它能够帮助开发者有效地管理和调度并发任务,提高程序的执行效率。这个名为"ios-dispatch的简单demo.zip"的压缩包文件包含了关于GCD中...

    spark-dispatch.zip

    spark-dispatch.zip

    Cocoa多线程编程之 block 与 dispatch quene

    本文将深入探讨Cocoa中的多线程编程,特别是如何利用block(闭包)和dispatch queue(调度队列)来实现线程间的协调。 首先,理解block的概念至关重要。Block是Objective-C中的一种轻量级的闭包,它允许我们将代码...

    Python库 | plum-dispatch-1.3.0.tar.gz

    6. **测试**:为了确保库的稳定性和可靠性,"plum-dispatch-1.3.0"中很可能包含了单元测试和集成测试,这些测试用例覆盖了库的各种功能和边界情况。 7. **兼容性**:考虑到Python的版本兼容性,Plum Dispatch 1.3.0...

Global site tag (gtag.js) - Google Analytics