`
cuixuxucui
  • 浏览: 351882 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android view(5)自定义组件

 
阅读更多

 

一、view的绘制流程是从ViewRoot的performTraversals方法开始的,包含以下三个过程:

1.measure过程

从顶级view开始遍历,在performMeasure调用measure,然后调用OnMeasure。onMeasure会对所有子元素进行measure完成遍历。

2.layout过程

同上。performLayout->layout->onLayout

3.draw过程

同上。performDraw->draw->onDraw

二、DecorView

继续自LinearLayout,view层的事件都先经过DecorView,然后才传递给我们的view.在LinearLayout中,包含两个部分,分别是标题栏和内容栏。内容栏的id就叫content,经常使用的setContentView就是加到这个内容栏中的,如setContentView(R.layout.hello_world_layout);可以这样获取我们设置的view:

ViewGroup content = (ViewGroup)findViewById(android.R.id.content);

content.getChildAt(0)

三、如何获得宽高

因为view的measure过程和activity的生命周期不是同步执行的,因此无法保证activity执行onCreate,onStart,onResume时宽高已经测量完毕。如果没有测量完毕,则会返回0.有四种方法可以获得测量后的宽高,这里只介绍一个简单的:

protected void onStart(){

   super.onStart();

   view.post(new Runnable(){

         public void run(){

   int width = view.getMeasuredWidth();

int height = view.getMeasureHeight();

}

      }

   );

}

通过post可以将一个runnable投递到一个消息队列的尾部,然后等待looper调用此runnable的时候,view也已经初始化好了。

四、自定义组件注意事项

1.重写onMeasure方法并设置wrap_content时的自身大小,否则在布局中使用wrap_content就相当于使用match_parent。

2.在draw方法中支持padding和margin

3.view中如果有线程或者动画需要及时停止。当包含view的activity退出或者当前的view被remove时,view的onDetachedFromWindow方法会被调用,相对应的,启动时执行onAttachedToWindow。

五、自定义组件继承自View重写onDraw方法

public class CircleView extends View{

   private int mColor = Color.RED;

   private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

   

   public CircleView(Context context){

      super(context);

 init();

   }

 

   public CircleView(Context context,AttributeSet attrs){

      super(context,attrs);

 init();

   }

   

   public CircleView(Context context,AttributeSet attrs,int defStyleAttr){

      super(context,attrs,defStyleAttr);

 init();

   }

   

   private void init(){

      mPaint.setColor(mColor);

   }

   

   protected void onDraw(Canvas canvas){

      super.onDraw(canvas);

 //为了让padding和wrap_content生效,要做处理

 final int paddingLeft = getPaddingLeft();

 final int paddingRight = getPaddingRight();

 final int paddingTop = getPaddingTop();

 final int paddingBottom = getPaddingBottom();

 

 int width = getWidth() - paddingLeft - paddingRight;

 int height = getHeight() - paddingTop - paddingBottom;

 int radius = Math.min(width,height)/2;

 canvas.drawCircle(paddingLeft+width/2,paddingTop+height/2,radius,mPaint);

   }

}

自定义属性参见206页

六、继承viewgroup派生特殊的layout

参见210页

分享到:
评论

相关推荐

    android自定义组件简单Demo

    5. **属性设置**:为了让自定义组件能在XML布局文件中使用并设置属性,我们需要实现`attr.xml`文件定义自定义属性。然后在`TestOurselfWidget`类中通过`obtainStyledAttributes()`方法获取这些属性值。 6. **注册到...

    android自定义组件demo

    这个"android自定义组件demo"实例提供了三种自定义组件的示例,是学习和理解Android自定义组件的一个宝贵资源。下面我们将深入探讨这三个自定义组件的关键知识点,并提供相关的实践指导。 1. **自定义View的基本...

    Android自定义组件开发

    在Android应用开发中,自定义组件是提升用户体验和实现独特设计的重要手段。本文将深入探讨Android自定义组件的开发过程,旨在帮助开发者更好地理解和实践这一关键技能。 首先,理解Android组件的基本概念至关重要...

    Android中自定义组件的过程

    1. **创建新类**:自定义组件通常继承自Android提供的基础视图类,如`View`、`TextView`或`ImageView`。例如,你可以创建一个名为`CustomView`的新类,让它继承自`View`。 2. **构造函数**:为新组件提供构造函数,...

    Android自定义组件开发详解.docx

    Android自定义组件的开发是Android应用开发中的一个重要部分,它涉及到自定义View和ViewGroup的创建,以及对canvas和paint的深入理解和运用。自定义组件能够满足开发者对于UI设计的独特需求,提升用户体验,同时也是...

    Android 自定义TimePicker组件

    在Android开发中,TimePicker组件是一个非常常用的控件,它允许用户选择小时和分钟,通常用于设置闹钟、设定时间等场景...自定义组件不仅可以提高用户体验,还能增强应用的个性化和差异化,是提升产品品质的重要手段。

    android绘图 自定义组件

    在Android应用开发中,自定义组件是提升用户体验和实现独特设计的关键技术。Android绘图与自定义组件的结合,能够让我们创造出独具特色的交互效果和视觉表现。以下将详细阐述这两个重要概念及其应用。 1. Android...

    android自定义组件动画基础班

    在Android开发中,自定义组件是提升应用独特性和用户体验的关键技术之一。自定义组件不仅可以满足特定的设计需求,还可以实现各种创新的交互效果,比如动画。本教程将带你深入理解“android自定义组件动画基础班”的...

    android 自定义组件

    5. **属性定义与解析**:为了让自定义组件在XML布局文件中使用,我们需要定义自定义属性。这通常通过创建一个资源文件(res/values/attrs.xml),在其中声明组件的自定义属性。然后,在组件类中通过`...

    Android自定义组件一[文].pdf

    在Android开发中,自定义组件是非常常见且重要的技术,它允许开发者根据项目需求创造出具有独特功能和视觉效果的UI元素。本篇文章将详细介绍如何在Android中实现自定义组件,主要分为以下几个方面: 首先,自定义...

    Android 自定义组件开发

    1. 创建自定义组件:自定义组件通常继承自Android内置的View或ViewGroup类。通过重写构造函数、onDraw()、onMeasure()和onLayout()等关键方法,可以定制组件的行为和外观。 2. 绘制原理:Android的绘图主要依赖于...

    android自定义view自定义buttonDemo

    首先,自定义View在Android开发中扮演着关键角色,它允许开发者超越系统提供的标准视图组件,创建出满足特定需求的复杂视图。自定义View通常包括以下步骤: 1. 创建一个新的Java类,继承自View或已有的View子类(如...

    Android:自定义组件绘制饼状统计图

    在Android中,自定义组件通常继承自已有的View或ViewGroup类。在这个例子中,我们将从View类派生,因为饼状图是一个单一的图形元素。我们创建一个新的Java类,比如`AppPieChartView`,并让它继承自`View`。 1. **...

    android 自定义view及自定义属性

    自定义View允许开发者创建自己的视图组件,以满足特定的需求或提供独特的用户交互体验。自定义View通常涉及到以下几个步骤: 1. **创建新类**:首先,你需要继承一个已有的View类,如`View`、`TextView`或`...

    安卓Android源码——自定义组件实现可滑动的ToggleButton的功能.zip

    1. **创建自定义View类**:自定义组件通常需要继承自Android的基础View或 ViewGroup 类。在这个案例中,我们可能创建了一个名为SlipButton的类,继承自ToggleButton。 2. **绘制视图**:自定义组件的核心在于重写`...

    android自定义组件(六) 刷新自定义控件

    在Android开发中,自定义组件是一项重要的技能,它允许开发者根据特定需求打造独特的用户界面。本文将深入探讨如何实现一个自定义的刷新控件,以此为应用增添个性化和交互性的功能。我们将基于提供的链接...

    android自定义组件(三)

    首先,自定义组件的基础是理解Android的View和ViewGroup系统。View是UI的基本元素,如按钮、文本框等,而ViewGroup是容器,用于组织和管理多个View。自定义组件通常是在这两个类的基础上进行扩展。 1. **创建自定义...

    android自定义组件(二)

    首先,自定义组件的基础是理解Android的View和ViewGroup系统。View是UI的基本元素,如按钮、文本框等,而ViewGroup是容器,用于组织和管理多个View。自定义组件通常是在这两个类的基础上进行扩展。 1. **创建自定义...

    Android音频剪辑裁剪自定义view

    在自定义View的设计上,我们需要创建一个可以拖动的滑块组件,该组件能够显示音频的时长并响应用户的触摸事件。这可以通过继承`View`类并重写`onTouchEvent()`方法来实现。在滑块上,我们可以添加两个指针,分别代表...

Global site tag (gtag.js) - Google Analytics