自定义视图(继承View)

前言

  Android提供了丰富的控件,但是有时候还是不能满足自己的需求,这时候就需要自定义视图了,自定义视图分为几种,一种为继承为View的,一种为继承于ViewGroup的。继承于View的需要我们自己去绘制控件,继承于ViewGroup的可以组织已有的控件,下面就先介绍下继承于View的情况。

效果图

  下面就是自定义了一个简单的圆形图来介绍整个的绘制过程,如下所示

  

概述

  绘制一个控件需要绘制两部分内容,一是尺寸,二是内容,这通过两个方法来进行绘制,一个是onMeasure、一个是onDraw,整体结构如下所示

  

 1 public class CustomView extends View {
 2
 3     public CustomView(Context context, AttributeSet attrs) {
 4         super(context, attrs);
 5     }
 6     //绘制内容
 7     @Override
 8     protected void onDraw(Canvas canvas) {
 9         super.onDraw(canvas);
10     }
11     //计算尺寸大小
12     @Override
13     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
14         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
15     }
16
17 }

onMeasure

  这个函数用来计算控件的大小尺寸,尺寸这个地方有一个概念为绘制模式

  MeasureSpec.AT_MOST:父元素指定控件最大达到的尺寸,通过设定为wrap_content为此模式

  MeasureSpec.EXACTLY:父元素指定控件精确的大小,比如设置为100dip,或者match_parent为此模式

  MeasureSpec.UNSPECIFIED:父元素不控制控件的大小,其大小完全由内部控制

  这个模式,可以通过int mode = MeasureSpec.getMode(widthMeasureSpec);方法来获取模式。

  等计算好大小后,通过setMeasuredDimension(width, height);方法来设置宽高

onDraw

  这个函数用来绘制控件的内容,这个函数传入了一个Canvas对象,这个是当前的Canvas对象,把需要绘制的内容绘制到这个Canvas上即可,可以通过Canvas中的drawCircle、drawLine、drawText等方法来绘制内容,如果需要设定笔线内容,通过paint对象来设定

源码

  Java

  

 1 public class CustomView extends View {
 2
 3     int height=0,width=0;
 4     private int cx;    //圆心x
 5     private int cy;    //圆心y
 6     private int padding=5;    //控件边距
 7
 8     public CustomView(Context context, AttributeSet attrs) {
 9         super(context, attrs);
10     }
11     @Override
12     protected void onDraw(Canvas canvas) {
13         super.onDraw(canvas);
14         //计算圆心位置、半径
15         cx = width/2;
16         cy = height/2;
17         int radius = cx>cy?cy:cx;
18
19         Paint paint = new Paint();
20         paint.setColor(Color.RED);
21         canvas.drawCircle(cx, cy, radius, paint);
22         canvas.drawColor(Color.GRAY);
23     }
24     //计算尺寸大小
25     @Override
26     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
27         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
28
29         widthMeasureSpec = MeasureSpec.getSize(widthMeasureSpec);
30         heightMeasureSpec = MeasureSpec.getSize(heightMeasureSpec);
31         //计算宽度
32         int mode = MeasureSpec.getMode(widthMeasureSpec);
33         if(mode==MeasureSpec.EXACTLY){
34             width = widthMeasureSpec + padding;
35         }else{
36             width = widthMeasureSpec;
37         }
38
39         //计算高度
40         mode = MeasureSpec.getMode(heightMeasureSpec);
41         if(mode==MeasureSpec.EXACTLY){
42             height = heightMeasureSpec + padding;
43         }else{
44             height = heightMeasureSpec;
45         }
46         setMeasuredDimension(width, height);
47     }
48
49 }

  布局文件

  

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context=".MainActivity"
10
11     >
12
13     <com.example.customview.CustomView
14         android:id="@+id/customView1"
15         android:layout_width="50dip"
16         android:layout_height="50dip"
17         android:layout_alignParentLeft="true"
18         android:layout_alignParentTop="true"
19         />
20
21 </RelativeLayout>

后记

  这篇文章主要是说了下绘制的一个整体过程,实现的功能比较简单,但是再复杂的内容其原理是相同的,通过这个过程可以发挥想象力来绘制控件,关于通过组合控件来进行绘制的情况再下篇文章中进行叙述。

原文地址:http://www.cnblogs.com/luoaz/p/3980651.html

  

时间: 2024-11-02 23:40:39

自定义视图(继承View)的相关文章

自定义控件(视图)2期笔记14:自定义视图之View事件分发 dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程

1. 这里我们先从案例角度说明dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程: (1)首先我们重写一个MyButton 继承自 Button,代码如下: 1 package com.himi.eventdemo; 2 3 import android.content.Context; 4 import android.util.AttributeSet; 5 import android.util.Log; 6 import andro

UI开发----自定义视图和视图控制器(Controller)

//  Created By 郭仔  2015年04月14日21:34:01 一.自定义视图: 根据需求的不同,?自定义视图继承的类也有所不同.?一般?自定义的 视图会继承于UIView.以下是?自定义视图的要点: 1.创建?一个UIView?子类 2.在类的初始化?方法中添加?子视图 3.类的.h?文件提供?一些接?口(?方法),便于外界操作?子视图 ================== 这里以label-textfield自定义视图为例: 把Label和Textfield封装到LTView中

iOS基础-自定义视图、视图控制器

自定义视图 例如,登陆页面中,左边label,右边textField.自定义 @interface LTView : UIView @property (nonatomic,retain) UILabel *label; @property (nonatomic,retain) UITextField *textField; - (instancetype)initWithFrame:(CGRect)frame text:(NSString *)text placeHolder:(NSStrin

UI第三讲.自定义视图 视图控制器指定自定义view 检测屏幕旋转 处理内存警告 容器视图控制器

一.自定义视图 (自定义label-textField视图) 目的:为了进一步优化登录界面,提高代码的精简程度和复用性,可移植性,从而需要在原有视图控件的基础之上自由组合成自定义视图. 一般自定义的视图会继承于UIView.以下是自定义视图的要点和步骤: 1.创建一个UIView子类 2.在类的初始化方法中添加子视图 3.类的.h文件提供一些接口(方法),便于外界操作子视图. 例子及相应代码: 例题:假设我们使用LTView类代表label-textfield视图.创建一个LTView类继承于U

Android中自定义视图View之---前奏篇

前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用到一些自定义的View以达到我们所需要的效果.其实网上的很多案例我们看完之后,发现这部分没什么难度的,我总结了两点: 1.准备纸和笔,计算坐标 2.在onDraw方法中开始画图,invalidate方法刷新,onTouchEvent方法监听触摸事件 对于绘图相关的知识,之前在弄JavaSE相关的知识的时候,

自定义控件之直接继承View创建全新视图(二)

自定义控件我们上一节探讨了一种最简单的自定义是直接继承View的子类,实现控件的不同UI视图展示及功能的拓展,在学习新知识前可以温习下之前所学知识-自定义控件之对现有控件拓展(一). ok,在回顾了之前所学的知识之后,现在我们来学习稍微复杂点的自定义控件:今天我们实现一个直接继承于View的全新控件.大家都知道音乐播放器吧,在点击一首歌进行播放时,通常会有一块区域用于显示音频条,我们今天就来学习下,播放器音频条的实现. 首先我们还是先定义一个类,直接继承于View,并重写它的构造方法,并初始化一

Android中自定义视图View之---Canvas和Path对象

介绍Android中的Paint和Canvas的概念和使用方法 Android中的Paint和Canvas的概念是很简单的,就是我们用画笔在画布上进行绘制没什么难度的,我们只要拿到画笔Paint和画布Canvas对象就可以进行操作了.当然Canvas对象提供了很多绘制图形的方法,下面来看一下代码吧: package com.example.drawpathdemo; import android.annotation.SuppressLint; import android.content.Co

Android中自定义视图View之---开发案例

自定义视图View的案例 下面我们就是开始正式的进入自定义视图View了 在讲解正式内容之前,我们先来看一下基本知识 1.我们在自定义视图View的时候正确的步骤和方法 1).必须定义有Context/Attrbuite参数的构造方法,并且调用父类的方法 public LabelView(Context context, AttributeSet attrs) 不然会报错: 2).重写onMeasure方法 @Override protected void onMeasure(int width

iOS自定义alertView,继承自UIView,可以添加子视图,标题图片+文字

自定义alertView,继承自UIView,可以在消息区域添加子视图:addCustomerSubview 标题可以有图片+文字构成, 只支持两个按钮操作 // - 在需要alert的控制器调用 alertView show 方法 CustomAlertView *alertView = [[CustomAlertView alloc] initWithTitle:@"提示" message:@"dylan_lwb_" delegate:self cancelBu