Android自定义View
Android实现侧滑菜单

Android实现侧滑菜单侧滑菜单的实现在很多应用中都有所体现。
例如:QQ侧滑、微信侧滑等等,几乎是各个领域中的应用都有所涉及。
与此同时,实现侧滑的方式也是比比皆是。
下面为大家介绍其中一种的实现方式:自定义View实现侧滑菜单。
效果展示:具体的使用自定义View实现之前先理解一下原始的实现原理:1、使用ViewGroup存放2个View,一个是Menu菜单,一个是显示内容的Content2、监听比比皆是onTouchEvent事件处理ACTION_MOVE中的leftMargin位置,从而改变menu菜单的滑动位置当ACTION_UP时,根据显示菜单的宽度,决定将其显示或隐藏动画效果:(1)使用Scroller这个辅助类实现动画效果(2)单起一个Thread(或Task)来改变leftMargin的大小来实现动画效果3、使用自定义View实现侧滑菜单的实现原理:(1)自定义HorizontalScrollView(可自动左右滑动)子类,重写构造方法、onMesure、onLayout、onTouchEvent方法。
[1] onMesure:决定内部View的宽和高wallper = (LinearLayout) getChildAt(0);// 获取menu(菜单布局)实例menu = (ViewGroup) wallper.getChildAt(0);// 获取content(内容布局)实例content = (ViewGroup) wallper.getChildAt(1);// 设置menu的宽度menu_width = menu.getLayoutParams().width = screen_width- menu_rightpadding;// 设置content的宽度content.getLayoutParams().width = screen_width;[2] onLayout:决定子View的放置位置// 为正值,表示为内容区域向左移动if (changed) {this.scrollTo(menu_width, 0);}[3]onTouchEvent:决定内部View的移动监听case MotionEvent.ACTION_UP:int scrollX = getScrollX();// 内容区域左侧多出来的部分--隐藏在左边的宽度if (scrollX>= menu_width / 2) {// smoothScrollTo隐藏(内容区域)效果相对缓和this.smoothScrollTo(menu_width, 0);isopen = false;} else {// 内容区域左边与屏幕合并this.smoothScrollTo(0, 0);isopen = true;}returntrue;[4]构造方法:(1)获取屏幕的宽度,以便于后面根据侧滑的比率判断是否显示子菜单;WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetricsoutMetrics = new DisplayMetrics();// 将当前窗口的信息放在DisplayMetrics中manager.getDefaultDisplay().getMetrics(outMetrics);screen_width = outMetrics.widthPixels;(2)将菜单栏距右侧距离dp转换为像素值px(自定义参数)menu_rightpadding = a.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(PLEX_UNIT_DIP, 50,context.getResources().getDisplayMetrics()));(2)引入自定义属性,允许用户自定义菜单距离屏幕右侧的边距[1] 书写xml文件<resources><attr name="rightPadding"format="dimension"></attr><declare-styleable name="SlidingMenu"><attr name="rightPadding"></attr></declare-styleable></resources>[2]布局中添加自定义属性的xmlnsxmlns:auto="/apk/res/com.example.fragment_horizontalscrollview"[3]构造方法中实现// 获取自定义的属性TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SlidingMenu, defStyle, 0);int n = a.getIndexCount();for (int i = 0; i< n; i++) {// 遍历所有属性int attr = a.getIndex(i);switch (attr) {case R.styleable.SlidingMenu_rightPadding:menu_rightpadding = a.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(PLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics()));Break;default:break;}}(3)布局中引入自定义属性auto:rightPadding="100dp"(4)引入nineoldandroids-2.4.0.jar(提供较低版本兼容性)nineoldandroids-2.4.0.jar(5)主界面中调用切换方法。
Android自定义wheelview实现滚动日期选择器

Android⾃定义wheelview实现滚动⽇期选择器本⽂实例为⼤家分享了Android实现滚动⽇期选择器的具体代码,供⼤家参考,具体内容如下wheelview滚动效果的View这段时间需要⽤到⼀个时间选择器,但是不能使⽤⽇期对话框,因为它是筛选条件框架下的,只能是View!这个WheelView改造后可以达到要求!这个wheelview框架使⽤的类不多,就⼏个,还有⼀些资源⽂件。
我根据这个框架设计了⽇期的选择器。
主页⾯:第⼀种⽇期选择器页⾯:动态效果:使⽤:具体的实现是⼀个LoopView的类,这是⼀个继承View的类!理解LoopView的公开⽅法就可以了。
1.布局⽂件<LinearLayout xmlns:android="/apk/res/android" xmlns:app="/apk/res-auto"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fff"><com.example.wheelview.loopview.LoopViewandroid:layout_marginTop="50dp"android:id="@+id/loopView"android:layout_width="match_parent"android:layout_height="150dp"app:awv_textsize="18"/></LinearLayout>2.控制代码package com.example.wheelview.activity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Toast;import com.example.wheelview.R;import com.example.wheelview.loopview.LoopView;import com.example.wheelview.loopview.OnItemSelectedListener;import java.util.ArrayList;public class MyActivity extends Activity {private Toast toast;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);final LoopView loopView = (LoopView) findViewById(R.id.loopView);ArrayList<String> list = new ArrayList<String>();for (int i = 0; i < 15; i++) {list.add("item " + i);}//设置是否循环播放// loopView.setNotLoop();//滚动监听loopView.setListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(int index) {if (toast == null) {toast = Toast.makeText(MyActivity.this, "item " + index, Toast.LENGTH_SHORT);}toast.setText("item " + index);toast.show();}});//设置原始数据loopView.setItems(list);}}那个⽇期选择器就是使⽤三个LoopView结合⽽成的!LoopView类⾥⾯控制字体颜⾊和横线颜⾊的地⽅://中间选中的字体颜⾊:灰⾊:0xff313131,橙⾊:0xffec6f1acenterTextColor = typedArray.getInteger(R.styleable.androidWheelView_awv_centerTextColor, 0xffec6f1a);//没被选中的字体的颜⾊outerTextColor = typedArray.getInteger(R.styleable.androidWheelView_awv_outerTextColor, 0xffafafaf);//中间字体上下两条横线的颜⾊dividerColor = typedArray.getInteger(R.styleable.androidWheelView_awv_dividerTextColor, 0xffc5c5c5);其他的控制可以参考我的代码我的项⽬的代码:我的代码中有⼀个时间的⼯具类,可以很⽅便的取到任何时间,你也可以在⽇期选择器中多加⼀个按钮,设置到今天的⽇期。
Android自定义TextView实现文本内容自动调整字体大小

Android⾃定义TextView实现⽂本内容⾃动调整字体⼤⼩最近做通讯录⼩屏机联系⼈姓名显⽰--长度超过边界字体变⼩/*** ⾃定义TextView,⽂本内容⾃动调整字体⼤⼩以适应TextView的⼤⼩* @author yzp*/public class AutoFitTextView extends TextView {private Paint mTextPaint;private float mTextSize;public AutoFitTextView(Context context) {super(context);}public AutoFitTextView(Context context, AttributeSet attrs) {super(context, attrs);}/*** Re size the font so the specified text fits in the text box assuming the* text box is the specified width.** @param text* @param textWidth*/private void refitText(String text, int textViewWidth) {if (text == null || textViewWidth <= 0)return;mTextPaint = new Paint();mTextPaint.set(this.getPaint());int availableTextViewWidth = getWidth() - getPaddingLeft() - getPaddingRight();float[] charsWidthArr = new float[text.length()];Rect boundsRect = new Rect();mTextPaint.getTextBounds(text, 0, text.length(), boundsRect);int textWidth = boundsRect.width();mTextSize = getTextSize();while (textWidth > availableTextViewWidth) {mTextSize -= 1;mTextPaint.setTextSize(mTextSize);textWidth = mTextPaint.getTextWidths(text, charsWidthArr);}this.setTextSize(PLEX_UNIT_PX, mTextSize);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);refitText(this.getText().toString(), this.getWidth());}}以上就是本⽂的全部内容,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,同时也希望多多⽀持!。
Android自定义ImageView实现点击两张图片切换效果

Android⾃定义ImageView实现点击两张图⽚切换效果笔者在做⼀个项⽬中遇到的⼀个⼩阻碍,于是就实现了这个ImageView达到开发需求情景需求 > 点击实现图⽚的切换可能有⼈会说了,这还不简单?为ImageView设置点击事件,然后通过重写的onClick(View v)⽅法判断定义的某⼀个flag进⾏图⽚的切换,伪代码如下:private boolean flag;public void onClick(View v){if(flag){mImageView.setImageResource(R.drawable.xx1);}else{mImageView.setImageResource(R.drawable.xx2);}flag = !flag;}笔者连上⾯的代码知道写出来那为什么还要去⾃定义⼀个ImageView了?具体需求:两个ImageView之间实现单选效果我们试想下,⽬前两个ImageView通过上⾯的代码可能还好,只要在不同的事件中做出不同的判断就好了,但如果⼀但ImageView增多了了?A:你不知道⽤ RadioGroup+RadioButton 啊!B:是哦!我现在去试下。
……B:不⾏啊,虽然RadioButton可以实现,但不好做适配,我为RadioButton设置Drawable,不能居中,⽽且不能随着RadioButton的⼤⼩改变⽽改变,资源图⽚是多⼤就多⼤,显⽰区域不够就不能完全显⽰出来。
A:…?,额,是吗?这样啊!那我们就⾃定义⼀个ImageView来实现吧!B:为什么是⾃定义ImageView?⽽不是⾃定义RadioButton?A:⾃定义RadioButton实现ImageView的src属性⽐较复杂(等着正在看这博客的⼤神实现),⽽⾃定义ImageView来实现单选的属性⽐较好实现。
B:那怎么实现了?A:看代码,代码如下:attrs.xml <为⾃定义ImageView添加两个属性><?xml version="1.0" encoding="utf-8"?><resources><declare-styleable name="SelectorImageView"><attr name="selector_src" format="reference"/>//选中的src图⽚属性<attr name="checked" format="boolean"/></declare-styleable></resources>Class - SelectorImageView<此类实现了Checkable接⼝,这⾥没什么特殊功能,⽽只是利⽤此接⼝中的⽅法⽽已,不实现我们也可以⾃⼰写>public class SelectorImageView extends ImageView implements Checkable {private boolean isChecked;private Drawable mSelectorDrawable;private Drawable mDrawable;public SelectorImageView(Context context) {this(context, null);}public SelectorImageView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public SelectorImageView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);/**获取默认属性src的Drawable并⽤成员变量保存*/mDrawable = getDrawable();final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SelectorImageView);/**获取⾃定义属性selector_src的Drawable并⽤成员变量保存*/Drawable d = a.getDrawable(R.styleable.SelectorImageView_selector_src);mSelectorDrawable = d;/**获取⾃定义属性checked的值并⽤成员变量保存*/isChecked = a.getBoolean(R.styleable.SelectorImageView_checked, false);setChecked(isChecked);if (d != null && isChecked) {/**如果在布局中设置了selector_src与checked = true,我们就要设置ImageView的图⽚为mSelectorDrawable */ setImageDrawable(d);}a.recycle();}@Overridepublic void setImageDrawable(Drawable drawable) {super.setImageDrawable(drawable);}@Overridepublic void setChecked(boolean checked) {this.isChecked = checked;}@Overridepublic boolean isChecked() {return isChecked;}@Overridepublic void toggle() {/**此处依据是否选中来设置不同的图⽚*/if (isChecked()) {setImageDrawable(mSelectorDrawable);} else {setImageDrawable(mDrawable);}}public void toggle(boolean checked){/**外部通过调⽤此⽅法传⼊checked参数,然后把值传⼊给setChecked()⽅法改变当前的选中状态*/setChecked(checked);toggle();}}layout.xml<LinearLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.qjay.adf.widget.SelectorImageViewandroid:id="@+id/iv"android:layout_width="100dp"android:layout_height="100dp"app:selector_src="@mipmap/checked"android:src="@mipmap/no_checked"/></LinearLayout>Activity Codepublic class MainActivity extends Activity {private SelectorImageView iv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);iv = (SelectorImageView) findViewById(R.id.iv);iv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {iv.toggle(!iv.isChecked());}});}}实现效果以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
【朝花夕拾】Android自定义View篇之(四)自定义View的三种实现方式及自定义属性使用介绍

【朝花⼣拾】Android⾃定义View篇之(四)⾃定义View的三种实现⽅式及⾃定义属性使⽤介绍前⾔尽管Android系统提供了不少控件,但是有很多酷炫效果仍然是系统原⽣控件⽆法实现的。
好在Android允许⾃定义控件,来弥补原⽣控件的不⾜。
但是在很多初学者看来,⾃定义View似乎很难掌握。
其中有很⼤⼀部分原因是我们平时看到的⾃定义View使⽤中,有多种形式,有的寥寥数笔,有的逻辑很复杂,有的直接继承View或ViewGroup,有的却直接继承系统的原⽣控件,有的可以直接使⽤系统定义的属性,⽽有的却⾃定义了⾃⼰的属性......所以不明⽩使⽤规则的开发者,很容易被这只“纸⽼虎”吓到。
实际上实现⾃定义View的⽅式,从整体上看,只分为三种:组合控件,继承控件,⾃绘控件。
然后就是根据需要来添加⾃定义的属性,就这么简单。
本⽂将会针对这4个⽅⾯进⾏详细的讲解。
主要内容如下:⼀、组合控件组合控件,顾名思义,就是将系统原有的控件进⾏组合,构成⼀个新的控件。
这种⽅式下,不需要开发者⾃⼰去绘制图上显⽰的内容,也不需要开发者重写onMeasure,onLayout,onDraw⽅法来实现测量、布局以及draw流程。
所以,在实现⾃定义view的三种⽅式中,这⼀种相对⽐较简单。
实际开发中,标题栏就是⼀个⽐较常见的例⼦。
因为在⼀个app的各个界⾯中,标题栏基本上是⼤同⼩异,复⽤率很⾼。
所以经常会将标题栏单独做成⼀个⾃定义view,在不同的界⾯直接引⼊即可,⽽不⽤每次都把标题栏布局⼀遍。
本节就⾃定义⼀个标题栏,包含标题和返回按钮两个控件,来介绍这种组合控件的实现⽅式。
1、定义标题栏布局⽂件定义标题栏的布局⽂件custom_title_view.xml,将返回按钮和标题⽂本进⾏组合。
这⼀步⽤于确定标题栏的样⼦,代码如下所⽰:1<?xml version="1.0" encoding="utf-8"?>2<RelativeLayout xmlns:android="/apk/res/android"3 android:layout_width="match_parent"4 android:layout_height="wrap_content"5 android:background="@android:color/holo_orange_light">6<Button7android:id="@+id/btn_left"8 android:layout_width="wrap_content"9 android:layout_height="wrap_content"10 android:layout_centerVertical="true"11 android:layout_marginLeft="5dp"12 android:text="Back"13 android:textColor="@android:color/white"/>1415<TextView16android:id="@+id/title_tv"17 android:layout_width="wrap_content"18 android:layout_height="wrap_content"19 android:layout_centerInParent="true"20 android:text="Title"21 android:textColor="@android:color/white"22 android:textSize="20sp"/>23</RelativeLayout>这个布局很简单,就不多说了。
Android开发自定义TextView省略号样式的方法

Android开发⾃定义TextView省略号样式的⽅法本⽂实例讲述了Android开发⾃定义TextView省略号样式的⽅法。
分享给⼤家供⼤家参考,具体如下:在布局xml中设置textView的字段android:maxLines="2"android:ellipsize="end"字段之后,textview会⾃动压缩⾏数,并且对压缩掉的部分⽤...显⽰。
如果不想⽤...⽽想⽤。
或者... ...就需要⾃定义这个省略号的样式,不需要⾃定义控件,⽅法如下。
⾸先是布局⽂件<TextViewandroid:id="@+id/textView4"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:maxLines="2"android:ellipsize="end"android:text="This is a text of TextView This is a text of TextView This is a text of TextView This is a text of TextView This is a text of TextView"android:textSize="20sp" />对textView进⾏代码控制protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);final TextView textView = (TextView)findViewById(R.id.textView4);Layout layout = textView.getLayout();//此时的layout为null,必须⽤观察者模式的回调函数来获取layoutSystem.out.println("layout是"+layout);//此处为nullViewTreeObserver observer = textView.getViewTreeObserver();observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {boolean isfirstRunning = true;@Overridepublic void onGlobalLayout() {//此⽅法会被调⽤两次,每执⾏⼀次settext就会执⾏⼀次,第⼀次是显⽰全部的⽂本,不加省略,第⼆次是加上省略,将会删减两次⽂本 // TODO Auto-generated method stubif(isfirstRunning==false)return;//如果不加这⼀⾏的条件,出来之后是完整单词+。
自定义view的基本流程

自定义view的基本流程1.自定义View的意义自定义View是开发Android应用的常见需求,它可以实现各种特殊的UI效果和交互效果。
有时候,自带的一些View无法满足我们的需求,而自定义一个View可以帮助我们实现想要的效果。
2.自定义View的基本流程要实现一个自定义View,通常需要经过以下基本流程:2.1创建自定义View类首先,我们需要创建一个自定义View的类,并继承自View或其子类,比如ImageView、TextView等。
在类中,我们可以重写onMeasure()、onLayout()和onDraw()等方法来实现自定义View的特殊行为。
2.2声明自定义View的属性如果我们希望在XML布局文件中使用自定义View,并可以在代码中设置属性值,就需要在类中声明自定义属性。
这可以通过在res/values/attrs.xml文件中定义属性集合来实现。
2.3实现自定义View的布局在onMeasure()方法中,我们可以指定自定义View在测量时占用的空间大小。
在onLayout()方法中,我们可以指定子View的位置。
2.4实现自定义View的绘制在onDraw()方法中,我们可以通过调用Canvas的API来实现自定义View的绘制效果。
例如,我们可以通过Path绘制自定义的图形,通过Paint设置绘制时的样式和颜色等。
2.5对自定义View进行测试最后,我们需要通过手动测试、单元测试、自动化UI测试等方式,对自定义View进行测试和验证。
3.自定义View的实例以下是一个简单的自定义View实例,用于显示一个可以按下和弹起的按钮:```public class MyButton extends View{private boolean isPressed=false;public MyButton(Context context){super(context);}public MyButton(Context context,AttributeSet attrs) {super(context,attrs);}@Overrideprotected void onDraw(Canvas canvas){super.onDraw(canvas);Paint paint=new Paint();paint.setColor(isPressed?Color.RED:Color.GREEN);canvas.drawRect(0,0,getWidth(),getHeight(), paint);}@Overridepublic boolean onTouchEvent(MotionEvent event){if(event.getAction()==MotionEvent.ACTION_DOWN) {isPressed=true;invalidate();return true;}else if(event.getAction()==MotionEvent.ACTION_UP){isPressed=false;invalidate();return true;}return super.onTouchEvent(event);}}```以上代码中,我们实现了一个MyButton类,当MyButton被按下时,它的背景颜色会变成红色,当MyButton被弹起时,它的背景颜色会回到绿色。
android 常见view的用法

android 常见view的用法常见的Android View的用法有:1. TextView(文本视图):用于显示文本内容,可以设置字体、颜色、字体大小等属性。
2. ImageView(图片视图):用于显示图片,可以设置图片资源、缩放类型、背景等属性。
3. Button(按钮):用于触发点击事件,可以设置文本、背景、点击效果等属性。
4. EditText(编辑文本视图):用于输入文本内容,可以设置提示文本、输入类型、最大长度等属性。
5. RadioButton(单选按钮):用于在多个选项中选择一个,可以设置文本、选中状态等属性。
6. CheckBox(复选框):用于在多个选项中选择多个,可以设置文本、选中状态等属性。
7. ProgressBar(进度条):用于显示操作进度,可以设置进度值、样式、颜色等属性。
8. SeekBar(滑动条):用于选择数值范围,可以设置最小值、最大值、当前值等属性。
9. ListView(列表视图):用于显示大量数据列表,可以自定义每一项的布局和交互。
10. GridView(网格视图):用于显示数据的表格布局,可以自定义每个单元格的布局和交互。
11. RecyclerView(可复用列表视图):Android的推荐使用的列表视图,功能更强大、性能更优。
12. WebView(网页视图):用于显示网页内容,可以加载本地或远程网页。
13. ScrollView(滚动视图):用于包裹超出屏幕大小的内容,并通过滑动来查看全部内容。
14. LinearLayout(线性布局):用于按照水平或垂直方向排列子视图。
15. RelativeLayout(相对布局):用于按照相对位置摆放子视图,灵活性更高。
16. FrameLayout(帧布局):用于叠加子视图,通常用于显示单个子视图或切换视图。
这些是Android中常见的View,开发者可以根据实际需求选择合适的View并设置相应的属性,实现各种不同的界面效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android高手进阶教程(三)之----Android 中自定义View的应用. 2010-04-18 21:11:25标签:Android进阶View定义教程原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。
否则将追究法律责任。
/1556324/311457大家好我们今天的教程是在Android 教程中自定义View 的学习,对于初学着来说,他们习惯了Android 传统的页面布局方式,如下代码:view plaincopy to clipboardprint?1.<?xml version="1.0" encoding="utf-8"?>2.<LinearLayout xmlns:android="/apk/res/android"3. android:orientation="vertical"4. android:layout_width="fill_parent"5. android:layout_height="fill_parent"6. >7.<TextView8. android:layout_width="fill_parent"9. android:layout_height="wrap_content"10. android:text="@string/hello"11. />12.</LinearLayout>13.<?xml version="1.0" encoding="utf-8"?>14.<LinearLayout xmlns:android="/apk/res/android"15. android:orientation="vertical"16. android:layout_width="fill_parent"17. android:layout_height="fill_parent"18. >19.<TextView20. android:layout_width="fill_parent"21. android:layout_height="wrap_content"22. android:text="@string/hello"23. />24.</LinearLayout>当然上面的布局方式可以帮助我们完成简单应用的开发了,但是如果你想写一个复杂的应用,这样就有点牵强了,大家不信可以下源码都研究看看,高手写的布局方式,如上面的布局高手通常是这样写的:view plaincopy to clipboardprint?1.<?xml version="1.0" encoding="utf-8"?>2.<A>3. <B></B>4.</A>5.<?xml version="1.0" encoding="utf-8"?>6.<A>7. <B></B>8.</A>view plaincopy to clipboardprint?其中A extends LinerLayout, B extends TextView.其中A extends LinerLayout, B extends TextView.为了帮助大家更容易理解,我写了一个简单的Demo ,具体步骤如下:首先新建一个Android 工程命名为ViewDemo .然后自定义一个View 类,命名为MyView(extends View) .代码如下:1.view plaincopy to clipboardprint?2.package com.android.tutor;3.import android.content.Context;4.import android.graphics.Canvas;5.import android.graphics.Color;6.import android.graphics.Paint;7.import android.graphics.Rect;8.import android.graphics.Paint.Style;9.import android.util.AttributeSet;10.i mport android.view.View;11.p ublic class MyView extends View {12. private Paint mPaint;13. private Context mContext;;15.16. public MyView(Context context) {17. super(context);18.19. }20. public MyView(Context context,AttributeSet attr)21. {22. super(context,attr);23.24. }25. @Override26. protected void onDraw(Canvas canvas) {27. // TODO Auto-generated method stub28. super.onDraw(canvas);29.30. mPaint = new Paint();31.32. //设置画笔颜色33. mPaint.setColor(Color.RED);34. //设置填充35. mPaint.setStyle(Style.FILL);36.37. //画一个矩形,前俩个是矩形左上角坐标,后面俩个是右下角坐标38. canvas.drawRect(new Rect(10, 10, 100, 100), mPaint);39.40. mPaint.setColor(Color.BLUE);41. //绘制文字42. canvas.drawText(mString, 10, 110, mPaint);43. }44.}45.p ackage com.android.tutor;46.i mport android.content.Context;47.i mport android.graphics.Canvas;48.i mport android.graphics.Color;49.i mport android.graphics.Paint;50.i mport android.graphics.Rect;51.i mport android.graphics.Paint.Style;52.i mport android.util.AttributeSet;53.i mport android.view.View;54.p ublic class MyView extends View {55.private Paint mPaint;56.private Context mContext;58.59.public MyView(Context context) {60. super(context);61.62.}63.public MyView(Context context,AttributeSet attr)64.{65. super(context,attr);66.67.}68.@Override69.protected void onDraw(Canvas canvas) {70. // TODO Auto-generated method stub71. super.onDraw(canvas);72.73. mPaint = new Paint();74.75. //设置画笔颜色76. mPaint.setColor(Color.RED);77. //设置填充78. mPaint.setStyle(Style.FILL);79.80. //画一个矩形,前俩个是矩形左上角坐标,后面俩个是右下角坐标81. canvas.drawRect(new Rect(10, 10, 100, 100), mPaint);82.83. mPaint.setColor(Color.BLUE);84. //绘制文字85. canvas.drawText(mString, 10, 110, mPaint);86.}87.}88.89.然后将我们自定义的View 加入到main.xml 布局文件中,代码如下:90.v iew plaincopy to clipboardprint?91.<?xml version="1.0" encoding="utf-8"?>92.<LinearLayout xmlns:android="/apk/res/android"93. android:orientation="vertical"94. android:layout_width="fill_parent"95. android:layout_height="fill_parent"96. >97.<TextView98. android:layout_width="fill_parent"99. android:layout_height="wrap_content"100. android:text="@string/hello"101. />102.<com.android.tutor.MyView103. android:layout_width="fill_parent"104. android:layout_height="fill_parent"105./>106.</LinearLayout>107.<?xml version="1.0" encoding="utf-8"?>108.<LinearLayout xmlns:android="/apk /res/android"109. android:orientation="vertical"110. android:layout_width="fill_parent"111. android:layout_height="fill_parent"112. >113.<TextView114. android:layout_width="fill_parent"115. android:layout_height="wrap_content"116. android:text="@string/hello"117. />118.<com.android.tutor.MyView119. android:layout_width="fill_parent"120. android:layout_height="fill_parent"121./>122.</LinearLayout>最后执行之,效果如下图:OK,大功告成,今天就写到这里,开始做饭了,老婆孩子等我做饭了,lol~对于Android系统的自定义View可能大家都熟悉了,对于自定义View的属性添加,以及Android的Layout的命名空间问题,很多网友还不是很清楚,今天Android123一起再带大家温习一下。