Android自定义View
Android高手进阶教程(三)之----Android 中自定义View的应用. 2010-04-18 21:11:25
标签:Android进阶View定义教程
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。https://www.360docs.net/doc/5615836084.html,/1556324/311457
大家好我们今天的教程是在Android 教程中自定义View 的学习,对于初学着来说,他们习
惯了Android 传统的页面布局方式,如下代码:
view plaincopy to clipboardprint?
1.
2. 3. android:orientation="vertical" 4. android:layout_width="fill_parent" 5. android:layout_height="fill_parent" 6. > 7. 8. android:layout_width="fill_parent" 9. android:layout_height="wrap_content" 10. android:text="@string/hello" 11. /> 12.
13.
14. 15. android:orientation="vertical" 16. android:layout_width="fill_parent" 17. android:layout_height="fill_parent" 18. > 19. 20. android:layout_width="fill_parent" 21. android:layout_height="wrap_content" 22. android:text="@string/hello" 23. /> 24.
当然上面的布局方式可以帮助我们完成简单应用的开发了,但是如果你想写一个复杂的应用,这样就有点牵强了,大家不信可以下源码都研究看看,高手写的布局方式,如上面的布局高手通常是这样写的:
view plaincopy to clipboardprint?
1.
3.
4.
5.
7.
8.
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. @Override
26. protected void onDraw(Canvas canvas) {
27. // TODO Auto-generated method stub
28. 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.@Override
69.protected void onDraw(Canvas canvas) {
70. // TODO Auto-generated method stub
71. 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.
92. 93. android:orientation="vertical" 94. android:layout_width="fill_parent" 95. android:layout_height="fill_parent" 96. > 97. 98. android:layout_width="fill_parent" 99. android:layout_height="wrap_content" 100. android:text="@string/hello" 101. /> 102. 103. android:layout_width="fill_parent" 104. android:layout_height="fill_parent" 105./> 106.
107.
108. 109. android:orientation="vertical" 110. android:layout_width="fill_parent" 111. android:layout_height="fill_parent" 112. > 113. 114. android:layout_width="fill_parent" 115. android:layout_height="wrap_content" 116. android:text="@string/hello" 117. /> 118. 119. android:layout_width="fill_parent" 120. android:layout_height="fill_parent" 121./> 122.
最后执行之,效果如下图:
OK,大功告成,今天就写到这里,开始做饭了,老婆孩子等我做饭了,lol~
对于Android系统的自定义View可能大家都熟悉了,对于自定义View的属性添加,以及Android的Layout的命名空间问题,很多网友还不是很清楚,今天Android123一起再带大家
温习一下。
1.CwjView myView=new CwjView(context);
复制代码
如果用于游戏或整个窗体的界面,我们可能直接在onCreate中setContentView(myView); 当然如果是控件,我们可能会需要从Layout的xml中声明,比如
1. 2.android:layout_width="wrap_content" 3.android:layout_height="wrap_content" 4./> 复制代码 当然,我们也可以直接从父类声明比如 1. 2.android:layout_width="wrap_content" 3.android:layout_height="wrap_content" 4./> 复制代码 上面我们仅用了父类View的两个属性,均来自android命名空间,而名称为layout_width 或layout_height,我们自定义的控件可能有更多的功能,比如 1. 2.android:layout_width="wrap_content" 3.android:layout_height="wrap_content" 4.cwj:age="22" 5.cwj:university="sjtu" 6.cwj:city="shanghai" 7./> 复制代码 我们可以看到上面的三个属性,是我们自定义的。作为标准xml规范,可能还包含了类似xmlns:android="https://www.360docs.net/doc/5615836084.html,/apk/res/android" 这样的语句,对于定义完整的 View,我们的命名空间为cwj,这里可以写为 xmlns:cwj=https://www.360docs.net/doc/5615836084.html,/apk/res/https://www.360docs.net/doc/5615836084.html,.android123.cwjView 或xmlns:cwj=https://www.360docs.net/doc/5615836084.html,/apk/res/android 都可以。 对于定义的cwj命名空间和age、university以及city的三个属性我们如何定义呢? 在工程的res/values目录中我们新建一个cwj_attr.xml文件,编码方式为utf-8是一个好习惯,内容如 下 1. 2. 3. 4. 5. 6. 7. 8. 复制代码 这里我们可能对format不是很熟悉,目前Android系统内置的格式类型有integer比如ProgressBar的进度值,float比如RatingBar的值可能是3.5颗星,boolean比如ToggleButton 的是否勾选,string比如TextView的text属性,当然除了我们常见的基础类型外,Android 的属性还有特殊的比如color是用于颜色属性的,可以识别为#FF0000等类型,当然还有dimension的尺寸类型,比如23dip,15px,18sp的长度单位,还有一种特殊的为reference,一般用于引用@+id/cwj @drawable/xxx这样的类型。 当然什么时候用reference呢? 我们就以定义一个颜色为例子, 1. 复制代码 这里我们用了逻辑或的运算符,定义的红色是颜色类型的,同时可以被引用 当然,对于我们自定义的类中,我们需要使用一个名为obtainStyledAttributes的方法来获取我们的定义。在我们自定义View的构造方法(Context context, AttributeSet attrs)的重载类型中 可以用 1.public CwjView(Context context, AttributeSet attrs) { 2.super(context, attrs); 3.TypedArray a = context.obtainStyledAttributes(attrs, 4.R.styleable.cwj_attr); 5.mAge = a.getInteger(R.styleable.CwjView_age, 22); 6.mCity = a.getString(R.styleable.CwjView_city, "shanghai"); 7.mUniversity= a.getString(R.styleable.CwjView_university, "sjtu"); 8. 9. a.recycle(); //Android123提示大家不要忘了回收资源 10. 11.} 复制代码 这样类的全局成员变量mAge、mCity就获取了我们需要的内容,当然根据layout中的数值我们自定义的CwjView需要动态的处理一些数据的情况,可以使用AttributeSet类的 getAttributeResourceValue方法获取。 1.public CwjView(Context context, AttributeSet attrs) 2.{ 3.super(context, attrs); 4.resId = attrs.getAttributeResourceValue("https://www.360docs.net/doc/5615836084.html,.android123.CwjView", "age", 100); 5.resId = attrs.getAttributeResourceValue("https://www.360docs.net/doc/5615836084.html,.android123.CwjView", "city", "shanghai"); 6.//resID就可以任意使用了 7.} 复制代码 以上两种方法中,参数的最后一个数值为默认的,如果您有不明白的地方可以来函到android123@https://www.360docs.net/doc/5615836084.html,我们会在第一时间回复。(文/Android开发网) Android 自定义View 2009年10月13日星期二 18:12 在values/attrs.xml中: 编写MyView.java,继承View package test.cuntomizedview; import java.util.Calendar; import test.cuntomizedview.R; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.SystemClock; import android.util.AttributeSet; import android.view.View; public class MyView extends View { private Paint mPaint; private Context mContext; private String mStr; public MyView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; initMyView(); TypedArray params = context.obtainStyledAttributes(attrs, R.styleable.MyView); int backgroudId = params.getResourceId( R.styleable.MyView_imgBackground, 0); if (backgroudId != 0) setBackgroundResource(backgroudId); int textColor = params.getColor(R.styleable.MyView_textColor, 0XFFFFFFFF); setTextColor(textColor); float textSize = params.getDimension(R.styleable.MyView_textSize, 36); setTextSize(textSize); float paddingLeft = params.getDimension( R.styleable.MyView_textPaddingLeft, 41); float paddingTop = params.getDimension( R.styleable.MyView_textPaddingTop, 21); setPaddings(paddingLeft, paddingTop); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(mStr != null) { canvas.drawText(mStr, 0, 0, mPaint); } canvas.drawText("heiheihei", 30, 60, mPaint); } private void initMyView() { mPaint = new Paint(); mPaint.setColor(Color.WHITE); } private void setTextColor(int textColor) { mPaint.setColor(0XFFAABBCC); } private void setTextSize(float textSize) { mPaint.setTextSize(textSize); } private void setPaddings(float paddingLeft, float paddingTop) { setPadding((int)paddingLeft, (int)paddingTop, 0, 0); } } // 注意怎样在attrs中怎样定义background并取得background。 在layout中使用MyView, main.xml xmlns:android="https://www.360docs.net/doc/5615836084.html,/apk/res/android" xmlns:app="https://www.360docs.net/doc/5615836084.html,/apk/res/test.cuntomizedview" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> android:layout_width="fill_parent" android:layout_height="fill_parent" app:textColor="#FFFFFFFF" app:textSize="40dip" app:textPaddingLeft="40dip" app:textPaddingTop="40dip" app:imgBackground="@drawable/bg_time" /> android 自定义圆角头像以及使用declare-styleable进行配置属性解析由于最新项目中正在检查UI是否与效果图匹配,结果关于联系人模块给的默认图片是四角稍带弧度的圆角,而我们截取的图片是正方形的,现在要给应用统一替换。应用中既用到大圆角头像(即整个头像是圆的)又用到四角稍带弧度的圆角头像,封装一下以便重用。以下直接见代码 [java] view plain copy 在CODE上查看代码片派生到我的代码片 package com.test.demo; import com.test.demo.R; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.widget.ImageView; /** * 圆角imageview */ public class RoundImageView extends ImageView { private static final String TAG = "RoundImageView"; /** * 图片的类型,圆形or圆角 */ private int type; public static final int TYPE_CIRCLE = 0; public static final int TYPE_ROUND = 1; /** * 圆角大小的默认值 android studio 控件常用属性 下面是RelativeLayout各个属性 1.android:layout_above="@id/xxx" --将控件置于给定ID控件之上 2.android:layout_below="@id/xxx" --将控件置于给定ID控件之下 3. android:layout_toLeftOf="@id/xxx" --将控件的右边缘和给定ID控件的左边缘对齐 4.android:layout_toRightOf="@id/xxx" --将控件的左边缘和给定ID控件的右边缘对齐 5. android:layout_alignLeft="@id/xxx" --将控件的左边缘和给定ID控件的左边缘对齐 6.android:layout_alignTop="@id/xxx" --将控件的上边缘和给定ID控件的上边缘对齐 7.android:layout_alignRight="@id/xxx" --将控件的右边缘和给定ID控件的右边缘对齐 8.android:layout_alignBottom="@id/xxx" --将控件的底边缘和给定ID控件的底边缘对齐 9.android:layout_alignParentLeft="true" --将控件的左边缘和父控件的左边缘对齐 10. android:layout_alignParentTop="true" --将控件的上边缘和父控件的上边缘对齐 11. android:layout_alignParentRight="true" --将控件的右边缘和父控件的右边缘对齐 12.android:layout_alignParentBottom="true" --将控件的底边缘和父控件的底边缘对齐 13.android:layout_centerInParent="true" --将控件置于父控件的中心位置 14.android:layout_centerHorizontal="true" --将控件置于水平方向的中心位置 15.android:layout_centerVertical="true" --将控件置于垂直方向的中心位置 android:layout_width 设置组件的宽度 android:layout_height 设置组件的高度 android:id 给组件定义一个id值,供后期使用 android:background 设置组件的背景颜色或背景图片 android:text 设置组件的显示文字 android:textColor 设置组件的显示文字的颜色 android:layout_below 组件在参考组件的下面 android:alignTop 同指定组件的顶平行 Android平台我的日记 设计文档 项目名称:mydiray 项目结构示意: 阶段任务名称(一)布局的设计 开始时间: 结束时间: 设计者: 梁凌旭 一、本次任务完成的功能 1、各控件的显示 二、最终功能及效果 三、涉及知识点介绍 四、代码设计 activity_main.xml: android:layout_centerHorizontal="true" android:layout_marginTop="88dp" android:text="@string/wo" android:textSize="35sp"/> 《Android基础应用》 Android常用控件 ?本章任务 ?使用Android开发使用时间组件 ?使用Android开发使用进度条组件 ?使用Android开发创建底部选项卡 ?本章目标 ?了解Android的组件层次结构 ?掌握常用的日期时间类控件 ?掌握常用的几个容器组件 1.Android组件的层次结构 UI组件都是View的子类,View有很多子类,它们之间存在树状的继承关系View及其子类结构图 TextView及其子类结构图 ViewGroup及其子类结构图 其下的子类一般作为容器或布局来使用 FrameLayout及其子类结构图 其下的子类通常作为容器或布局来使用 2.时间控件 2.1日期时间选择器 DatePicker组件可用于输入日期,TimePicker组件可用来选择时间,只能输入小时和分,默认12小时制 DatePicker ●使用onDateChangedListener监听器来获取用户的日期选择 ●使用init对组件进行初始化 ●使用getYear,getMonth,getDayOfMonth方法获得用户选择的年,月,日 TimePicker ●使用onTimeChangedListener监听器获取用户的时间选择 ●使用setIs24HourView设置是否以24小时制显示 ●使用getCurrentHour获得当前的小时数 ●使用getCurrentMinute获得当前的分钟数 示例 示例的实现结果 2.2时钟组件 AnalogClock组件用来以表盘的方式显示当前时间,该表只有时针和分针,DigitClock组件以数字的方式显示当前时间可以显示时分秒,由于DigitClock继承TextView,可以使用TextView 的属性 示例 android 自定义控件的过程 invalidate()会导致computeScroll()以及onDraw()方法的执行computeScroll()方法是在屏幕流动的时候不停的去调用,scrollTo(int x,int y)则是滚动到相应的位置; scrollBy(int x, int y)则是移动一些距离,X为正是向左移动,为负时向右移动,Y与X的意义一个,只是是上下移动而已View对象显示在屏幕上,有几个重要步骤: 1.构造方法创建对象 2.测量View的大小onMeasure(int,int); 3.确定View的位置,View自身有一些权,决定权在父View手中. onLayout();基本上不常用,在继承View的时候基本上用不着,但在继承ViewGroup的时候的就要用到了,因为要对View进行布局,确定View的位置,确定的时候使用 指定子View的位置,左,上,右,下,是指在ViewGroup坐标系中的位置https://www.360docs.net/doc/5615836084.html,yout(int xtop,int ytop, int xbottom, int ybottom); 4.绘制View的内容onDraw(Canvas) 实现过程: 1、构造方法: /** * 在布局文件中声名的view,创建的时候由系统调用 * * @param context * 上下文对象 * @param attrs * 属性集 */ public MyToggleButton(Context context, AttributeSet attrs) { super(context, attrs); initView(); } 2、测量View的大小: /** * 测量尺寸时的回调方法 */ android常用控件大全 在Android中使用各种控件(View) DatePicker-日期选择控件 TimePicker-时间选择控件 ToggleButton-双状态按钮控件 EditText-可编辑文本控件 ProgressBar-进度条控件 SeekBar-可拖动的进度条控件 AutoCompleteTextView-支持自动完成功能的可编辑文本控件 MultiAutoCompleteTextView-支持自动完成功能的可编辑文本控件,允许输入多值(多值之间会自动地用指定的分隔符分开) ZoomControls-放大/缩小按钮控件 Include-整合控件 VideoView-视频播放控件 WebView-浏览器控件 RatingBar-评分控件 Tab-选项卡控件 Spinner-下拉框控件 Chronometer-计时器控件 ScrollView-滚动条控件 在Android中使用的Layout FrameLayout:里面只可以有一个控件,并且不能设计这个控件的位置,控件会放到左上角 LinearLayout:里面可以放多个控件,但是一行只能放一个控件 TableLayout:这个要和TableRow配合使用,很像html里面的table AbsoluteLayout:里面可以放多个控件,并且可以自己定义控件的x,y的位置 RelativeLayout:里面可以放多个控件,不过控件的位置都是相对位置 (Android界面布局好像还可以直接引用一些view,如ScrollView等) 常用控件: 1,EditText 主要函数:setText/getText设置/获取文本内容,setHint设置缺省显示内容; 2,RadioGroup,RadioButton RadioButton的isChecked()判断是否被选中 获取选中RadioButon的ID:设置 RadioGroup.setOnCheckedChangeListener方法 publiconCheckedChanged(RadioGroupgroup,intcheckedId)//checkedId 是选中RadioButton的ID 3,CheckBox isChecked()判断是否被选中 setOnCheckedChangeListener方法监视选中状态改变情况 4,Spinner a,显示数据 1),硬编码加载 通过setAdapter方法设置类型为 ArrayAdapter(Contextcontext,inttextViewResId,String[]objects) textViewResourceId:显示内容的ViewID默认设置为 https://www.360docs.net/doc/5615836084.html,yout.simple_spinner_item Android进阶——自定义View之自己绘 制彩虹圆环调色板 引言 前面几篇文章都是关于通过继承系统View和组合现有View来实现自定义View的,刚好由于项目需要实现一个滑动切换LED彩灯颜色的功能,所以需要一个类似调色板的功能,随着手在调色板有效区域滑动,LED彩灯随即显示相应的颜色,也可以通过左右的按钮,按顺序切换显示一组颜色,同时都随着亮度的改变LED彩灯的亮度随即变化,这篇基本上把继承View重绘实现自定义控件的大部分知识总结了下(当然还有蛮多没有涉及到,比如说自适应布局等),源码在Github上 一、继承View绘制自定义控件的通用步骤 自定义属性和继承View重写onDraw方法 实现构造方法,其中public RainbowPalette(Context context, AttributeSet attrs) 必须实现,否则无法通过xml引用,public RainbowPalette(Context context) ,public RainbowPalette(Context context, AttributeSet attrs, int defStyleAttr)可选,通常在构造方法中完成属性和其他成员变量的初始化 重写onMeasure方法,否则在xml中有些设置布局参数无效 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(width, height);//重新设置View的位置,若不重写的话,则不会布局,即使设置centerInParent为true也无效 //setMeasuredDimension(width,height); } 手动调用invalidate或者postInvalidateon方法完成界面刷新 重写onTouchEvent方法实现基本的交互 定义回调接口供外部调用 二、彩虹圆环调色板设计思想 自定义Dialog; dialog = new Dialog(this); dialog.setContentView(https://www.360docs.net/doc/5615836084.html,yout.by_baseinfo); dialog.setTitle("dialog的title"); /* * 获取Dialog的窗口对象及参数对象以修改对话框的布局设置, 可以直接调用this.getWindow(),表示获得这个Activity的Window * 对象,这样这可以以同样的方式改变这个Activity的属性. * Activity不可见时getWindow()返回值为null; */ Window dialogWindow = dialog.getWindow(); // 对话框的布局设置参数; https://www.360docs.net/doc/5615836084.html,youtParams layoutParams = dialogWindow.getAttributes(); // 设置Window中的内容为左上对齐; dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP); /* * lp.x与lp.y表示相对于原始位置的偏移. * 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略. * 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略. * 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略. * 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略. * 当参数值包含Gravity.CENTER_HORIZONTAL时 * ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动. * 当参数值包含Gravity.CENTER_VERTICAL时 * ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动. * gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL | * Gravity.CENTER_VERTICAL. * * 本来setGravity的参数值为Gravity.LEFT | Gravity.TOP时对话框应出现在程序的左上角,但在 * 我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了, Gravity.LEFT, Gravity.TOP, * Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离 */ // 相对于屏幕原位置(加上标题栏) 的偏移量; lp.x = 100; // 新位置X坐标 今天和大家分享下组合控件的使用。很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最方便的一个方法。今天就来介绍下如何使用组合控件,将通过两个实例来介绍。 第一个实现一个带图片和文字的按钮,如图所示: 整个过程可以分四步走。第一步,定义一个layout,实现按钮内部的布局。代码如下: 1. 2. 实验二 android基本控件实验 【目的】 熟悉Android常用控件的基本操作,掌握它们的基本使用方法。了解控件之间的构成关系,熟悉适配器的使用原理。 【要求】 1、了解控件的继承关系; 2、掌握适配器的使用; 3、掌握信息提示的实现机制; 4、实现基本界面。 【原理】 1.控件类之间的关系 android.view.View类(视图类)呈现了最基本的UI构造块。View类是Android中的一个超类,几乎包含了所有的屏幕类型,主要负责绘制和事件处理。 Android中控件类的扩展结构如图所示。 View有众多的扩展者,它们大部分是在android.widget包中,这些继承者实际上就是Android 系统中的“控件”。View实际上就是各个控件的基类,创建交互式的图形用户界面的基础。View的直接继承者包括文本视图(TextView)、图像视图(ImageView)、进度条(ProgressBar)等。它们各自又有众多的继承者。每个控件除了继承父类功能之外,一般还具有自己的公有 方法、保护方法、XML属性等。 在Android中使用各种控件的一般情况是在布局文件中可以实现UI的外观,然后在Java文件中实现对各种控件的控制动作。控件类的名称也是它们在布局文件XML中使用的标签名称。 2.控件通用行为和属性 View是Android中所有控件类的基类,因此View中一些内容是所有控件类都具有的通用行为和属性。 提示:由于Java语言不支持多重继承,因此Android控件不可能以基本功能的“排列组合”的方式实现。在这种情况下,为了实现功能的复用,基类的功能往往做得较强,作为控件的祖先类,View所实现的功能也是最多的。 控件类经常在布局文件中使用,因此其可以使用XML属性(XMLAttributes),和Java代码经常具有对应关系。 View作为各种控件的基类,其XML属性所有控件通用,XML属性及其对应的方法如表1所示。 表1 View中的XML属性及其对应的方法 其中,android:id表示控件的标识,通常需要在布局文件中指定这个属性。View中与控件标识相关的几个方法如下所示: public int getId() // 获得控件的id(int类型) android自定义View之Android手机通讯录制作 我们的手机通讯录一般都有这样的效果,如下图: OK,这种效果大家都见得多了,基本上所有的Android手机通讯录都有这样的效果。那我们今天就来看看这个效果该怎么实现。 一.概述 1.页面功能分析 整体上来说,左边是一个ListView,右边是一个自定义View,但是左边的ListView 和我们平常使用的ListView还有一点点不同,就是在ListView中我对所有的联系人进行了分组,那么这种效果的实现最常见的就是两种思路: 1.使用ExpandableListView来实现这种分组效果 2.使用普通ListView,在构造Adapter时实现SectionIndexer接口,然后在Adapter 中做相应的处理 这两种方式都不难,都属于普通控件的使用,那么这里我们使用第二种方式来实现,第一种方式的实现方法大家可以自行研究,如果你还不熟悉ExpandableListView的使用,可以参考我的另外两篇博客: 1.使用ExpandableListView实现一个时光轴 2.android开发之ExpandableListView的使用,实现类似QQ好友列表 OK,这是我们左边ListView的实现思路,右边这个东东就是我们今天的主角,这里我通过自定义一个View来实现,View中的A、B......#这些字符我都通过canvas的drawText 方法绘制上去。然后重写onTouchEvent方法来实现事件监听。 2.要实现的效果 要实现的效果如上图所示,但是大家看图片有些地方可能还不太清楚,所以这里我再强调一下: 1.左边的ListView对数据进行分组显示 2.当左边ListView滑动的时候,右边滑动控件中的文字颜色能够跟随左边ListView 的滑动自动变化 3.当手指在右边的滑动控件上滑动时,手指滑动到的地方的文字颜色应当发生变化,同时在整个页面的正中央有一个TextView显示手指目前按下的文字 Android高手进阶教程(三)之----Android 中自定义View的应用. 2010-04-18 21:11:25 标签:Android进阶View定义教程 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。https://www.360docs.net/doc/5615836084.html,/1556324/311457 大家好我们今天的教程是在Android 教程中自定义View 的学习,对于初学着来说,他们习 惯了Android 传统的页面布局方式,如下代码: view plaincopy to clipboardprint? 1. 2. 创建控件并添加监听器的过程: 1.xml中定义控件() 2.Activity中实例化控件((Button)findViewById()) 3.创建监听器(OnClickListener) 4.绑定监听器(setOnClickListener) UI基础-内/外边距 UI基础-常用控件-单选按钮 UI基础-常用控件-输入控件 maxLines:最大行数。 maxLength:最大字符数。 hint:空白文字提示,当输入文字时自动消失。 password:密码文本框。 numeric:控制输入的数字类型,一共有三种分别为integer(正整数)、signed(带符号整数,有正负)和decimal(浮点数)。 digits:录入指定字符。 UI基础-常用控件-图片控件 CENTER:图片大小为原始大小,如果图片大小大于ImageView控件,则截取图片中间部分,若小于,则直接将图片居中显示。 CENTER_CROP:将图片等比例缩放,让图像的短边与ImageView的边长度相同,即不能留有空白,缩放后截取中间部分进行显示。 CENTER_INSIDE:将图片大小大于ImageView的图片进行等比例缩小,直到整幅图能够居中显示在ImageView中,小于ImageView的图片不变,直接居中显示。 FIT_CENTER:ImageView的默认状态,大图等比例缩小,使整幅图能够居中显示在ImageView中,小图等比例放大,同样要整体居中显示在ImageView中。 FIT_START:缩放方式同FIT_CENTER,只是将图片显示在左方或上方,而不是居中。FIT_END:缩放方式同FIT_CENTER,只是将图片显示在左方或上方,而不是居中。 FIT_XY:将图片非等比例缩放到大小与ImageView相同。 基于Android的自定义媒体播放控件设计与实现 摘要:针对日益增加的个性化应用需求,提出了基于Android的自定义媒体播放控件。该控件通过继承VideoView 实现视频、图片媒体的播放,与网络、数据库进行结合可以下载媒体资源与管理资源。控件中定义了下载回调,即实时显示当前的、下载进度,因而有助于提升用户体验。 关键词:Android;自定义控件;媒体播放;VideoView DOIDOI:10.11907/rjdk.161461 中图分类号:TP319 文献标识码:A 文章编号:1672-7800(2016)005-0079-03 0 引言 在Android系统中,提供了很多控件用于Android应用的开发,其控件的丰富性能可满足基本的应用开发需求。但是随着定制应用的日益增加,基本的控件已很难满足需求,从另一方面而言,这也约束了个性化应用的发展。Google提供的自定义控件方法可以达到应用开发的个性化要求[1]。在Android程序中,视频媒体播放使用VideoView控件实现,或者使用MediaPlayer与SurfaceView结合实现媒体播放功能。对于图片的显示则使用ImageView来实现[2]。日常生活中,视频和图片都是大众最常见的媒体,在一个界面上要既能显 示图片又能显示视频,所以,本文提出了一种继承VideoView 的自定义媒体播放控件,该控件不仅可以显示图片,还可以播放视频,并且在下载视频的过程中可以显示下载进度。同时,自定义媒体播放控件和数据库结合,能够实现媒体文件的自动循环播放。 1 Android系统 Android系统由Google公司2007年在Google I/O开发者大会上发布的移动操作系统,Google将其源码开放以供广大开发者研究。Android系统采用分层架构,具体分为Applications、Application Framework、Libraries(包含Android Runtime)、Linux Kernel四层。Android应用开发者最常接触的是前两层,后两层主要用于底层库和硬件驱动等[3-5]。 2 View及其自定义媒体控件相关类 2.1 View类介绍 在Android系统的Application Framework层,提供了丰富的UI控件,所有UI控件都是直接或间接继承View类。View 类是所有UI控件的基类,该类表示了用户界面的基本构建模块――一个View占用屏幕的矩形区域并且负责界面绘制和事件处理[6-7]。 View类中有很多方法,这些方法都与其界面绘制和事件处理相关,下面简单介绍几个方法: ①onMeasure(int,int):该方法用于获取控件的宽、高, 任务一Android 开发环境的搭建 第一部分知识回顾与思考 1. Android 的四层架构分别包括哪几层?分别起到什么作用? 答: Linux 内核层( Linux Kernel ):基于Linux 内核,内核为上层系统提供了系统服务。 系统库层( Libraries ):系统库基于C/C++ 语言实现,通过接口向应用程序框架层提供编程接口。 应用框架层( Application Framework ):为开发者提供了一系列的Java API,包括图形用户界面组件View 、 SQLite 数据库相关的API 、 Service 组件等。 应用程序层( Applications ):包含了Android 平台中各式各样的应用程序。 第二部分职业能力训练 一、单项选择题(下列答案中有一项是正确的,将正确答案填入括号内) 1. Android 四层架构中,应用框架层使用的是什么语法?(C) A . C B . C++C. Java D. Android 2. Android 四层架构中,系统库层使用的是什么语法?(B) A . V B B. C /C++C. Java D .Android 3.应用程序员编写的Android 应用程序,主要是调用(B)提供的接口进行实现。 A .应用程序层B.应用框架层C.应用视图层D.系统库层 二、填空题(请在括号内填空) 1.在 Android 智能终端中,有很多应用如拍照软件、联系人管理软件,它们都属于Android 的(应用程序)层。 2.为了让程序员更加方便的运行调试程序,Android 提供了(模拟器),可以方便的将程序运行其上, 而不要实际的移动终端。 3.为了支持Java 程序运行,我们需要安装(JDK )。 三、简答题 1.简述 Android 开发环境安装的步骤。 答:下载并安装JDK ,配置 JDK 的环境变量; 从 Anroid 官网上下载Android 开发组件(包含Eclipse 和 Android SDK 、 ADT ); 安装 Android 开发环境(包括配置Android SDK 的环境变量、打开 Eclipse 通过菜单设定Android SDK 路径)。 2.简述 Android 应用程序创建和运行的步骤。 自定义Android带图片的按钮 前言 现在移动设备的按钮设计讲究大图标小文字,希望用户只要一看到图标便能知道这个按钮是干嘛的,但又要有必要的文字提示,最常见的就数搜索按钮了,上面一个大大的放大镜图标,下面两个字——搜索。 Bill最近也在做具有这种效果的按钮,过程总是曲折的,不过结果总是美好滴~现在Bill把其做法分享给大家,希望对还不会的朋友有所帮助。 先看看bill曲折的过程吧,也许里面就有你的影子: 最开始以为直接利用Android控件ImageButton即可完事,谁知事不如人料,ImageButton 只能显示图片,并不能对其添加文字,此想法不攻自破。 于是我想到了直接用Button,但是Button的文字却是显示在图片内部,并不能达到我的需求。放弃。 懒人总有懒人的办法,我可以直接在图片下方PS需要的文字嘛,然后把P好的图片放进ImageButton就好了。此法十分简单好用。但是,一旦我们需要改变文字,或者我要把文字显示在图片顶部而不是底部怎么办?此法虽简单,却缺乏可变性。放弃。 这就是所谓的“一钮三折”了~ 那么,有没有一种方法既能够拥有Button的效果,又能够实现Button显示的自定义呢? 答案是肯定的,接下来,bill将一步一步详细解释这个按钮的制作过程。 思路 首先,我们来看一下这个按钮的实现思路。有一种思维方式叫做“out of box”,也就是鼓励大家跳出固定思维模式以寻求新的突破。但是在“跳出箱子”之前,我们必须首先知道困住我们思维的“箱子”是什么。 在这里,这个箱子就是“按钮”。我们一直在想,如何去实现这个“按钮”,怎么才能让“按钮”显示出图片,然后在图片下面还显示一行字。我们就在“按钮”这个箱子里纠结。 但实际上,当我们发现所谓的“按钮”其实就是一个View的时候,一切就变得简单了。 它只不过是一个可点击、可设置监听、可显示文字或者图片的View而已。那么我们就跳出Android给我们设置的这个箱子,自己重新造一个具有我们需要的功能和外观的View 不就OK了? 经过分析,上述按钮效果实际上就是一个布局,一个最简单不过的垂直线性布局,上部分是一个ImageView,下部分是一个TextView,这个布局可点击、可设置监听。 我们首先要编写自己的ImageButton类,然后在主布局文件中为我们自定义的Button 编写布局,最后在Activity中调用我们自定义ImageButton即可。 那么接下来我们就一起来实现这个简单的LinearLayout。 编码实现自己的ImageButton 在编写我们自己的ImageButton之前,如果读者并不清楚如何在一个静态的xml布局文件中动态地加载子布局,请先阅读下面的博文(此文言简意赅,已经写得很清楚了,bill就不再赘述) https://www.360docs.net/doc/5615836084.html,/lzx_bupt/article/details/5600187首先,我们编写一个MyImageButton类,继承自LinearLayout 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:layout_centerInparent 相对于父元素完全居中 android:layout_alignParentBottom 贴紧父元素的下边缘 android:layout_alignParentLeft 贴紧父元素的左边缘 android:layout_alignParentRight 贴紧父元素的右边缘 android:layout_alignParentTop 贴紧父元素的上边缘 android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物 第二类:属性值必须为id的引用名“@id/id-name” android:layout_below 在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左边 android:layout_toRightOf 在某元素的右边 android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐 android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐 android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐 android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐 第三类:属性值为具体的像素值,如30dip,40px android:layout_marginBottom 离某元素底边缘的距离 android:layout_marginLeft 离某元素左边缘的距离 android:layout_marginRight 离某元素右边缘的距离 android:layout_marginTop 离某元素上边缘的距离 EditText的android:hint 设置EditText为空时输入框内的提示信息。 花了一天时间写出了这个类来实现下拉刷新。 首先这是一个自定义的listView控件类,我在许多项目中都用到了它,效果很稳定。实现也很简单。用的时候其他功能都和系统提供的ListView一样,就只是多了一个下拉刷新监听。用这个类替代系统提供的ListView,下拉刷新再也不会烦恼了。\(^o^)/~ 希望对大家有用。 我写的自定义ListView的代码: import java.util.Date; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import https://www.360docs.net/doc/5615836084.html,youtInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.LinearInterpolator; import android.view.animation.RotateAnimation; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ProgressBar; import android.widget.TextView; public class MyListView extends ListView implements OnScrollListener { private static final String TAG = "listview"; private final static int RELEASE_To_REFRESH = 0; private final static int PULL_To_REFRESH = 1; private final static int REFRESHING = 2; private final static int DONE = 3; private final static int LOADING = 4; // 实际的padding的距离与界面上偏移距离的比例 private final static int RATIO = 3; private LayoutInflater inflater; private LinearLayout headView; private TextView tipsTextview;android 自定义圆角头像以及使用declare-styleable进行配置属性解析
android studio 控件常用属性
Android平台我的日记设计文档
Android常用控件
android 自定义控件的过程
android常用控件大全
Android进阶——自定义View之自己绘制彩虹圆环调色板
android自定义布局或View
Android自定义控件
实验二 android基本控件实验
android自定义View之Android手机通讯录制作
Android自定义View
Android基础-控件的使用
基于Android的自定义媒体播放控件设计与实现
Android应用开发基础习题
自定义Android带图片的按钮
android 控件常用属性
Android中自定义ListView控件实现下拉刷新,简单实用效果好(原创)