1.
2.
3.
4.
5.
6.
format类型,参见:Android中attr自定义属性详解。
2)item.xml
只要是xml的resources标签内即可,单独弄出来呢最好。用以下方式定义一个id,用于View.setId(int id),主要用于相对布局时,相对于某个id的View什么的。
ViewPager扩展组件定义的内容:
1.
3)创建组件
其类中引用属性资源。并看下ViewPager的使用说明吧:OnPageChangeListener 接口方法和PagerAdapter适配器内方法的注释。
1.public class TitleViewPager extends RelativeLayout implements
2. OnPageChangeListener, View.OnClickListener {
3.
4.private Context mContext; // 上下文
5.private LayoutInflater mInflater; // 布局加载器
6.
7.private int titleLayoutId; // 标题栏布局id
8.private int bgImageResId; // item背景图片资源id
9.private int bgLeftMargin; // 背景初始左边距
10.
11.private View titleLayout; // 标题栏布局
12.private ImageView mBgImage; // item背景图片
13.private ArrayList
14.
15.private ViewPager mViewPager; // ViewPager组件
16.private ArrayList
17.
18.private int prevOffset = -1; // 前次偏移值,这里用了int值像素
19.private int currentIndex; // 当前页面索引
20.private int previousIndex; // 前次页面索引
21.private boolean isTitleClicked; // 标题项点击
22.
23.private OnPageChangeListener mOnPageChangeListener; // 页面变化监
听事件
24.
25.// private final int REFRESH_RATE = 20; // 刷新速率20msec
26.// private Scroller mScroller; // 滚动器
27.// private static final Interpolator sInterpolator = new Interp
olator() {
28.// public float getInterpolation(float t) {
29.// t -= 1.0f;
30.// return t * t * t + 1.0f;
31.// }
32.// };
33.
34.public TitleViewPager(Context context, AttributeSet attrs) {
35.super(context, attrs);
36.
37. mContext = context;
38. mInflater = (LayoutInflater) context
39. .getSystemService(https://www.sodocs.net/doc/2b7007089.html,YOUT_INFLATER_SERVICE);
40.
41.// 获得TypedArray对象
42. TypedArray typedArray = context.obtainStyledAttributes(attr
s,
43. R.styleable.TitleViewPager);
44.// 获取标题栏布局id,默认0
45. titleLayoutId = typedArray.getResourceId(
46. R.styleable.TitleViewPager_tLayout, 0);
47.// 获取item背景图片资源id,默认0
48. bgImageResId = typedArray.getResourceId(
49. R.styleable.TitleViewPager_bImage, 0);
50.// 获取背景初始左边距,默认0
51. bgLeftMargin = typedArray.getInt(R.styleable.TitleViewPager
_bMargin, 0);
52.
53. initLayout(); // 初始化标题栏&ViewPager
54.
55. mItemViews = new ArrayList
56. mPageViews = new ArrayList
57. }
58.
59.// 初始化标题栏&ViewPager
60.private void initLayout() {
61. RelativeLayout containerLayout = new RelativeLayout(mContex
t); // 创建标题栏容器布局
62. containerLayout.setId(R.id.containerLayout); // 设置标识符
63. LayoutParams containerParams = new LayoutParams(
64. LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT
); // 宽度WRAP_CONTENT,高度WRAP_CONTENT
65. containerParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
66. RelativeLayout.TRUE); // 贴于顶部
67. containerParams.addRule(RelativeLayout.CENTER_HORIZONTAL,
68. RelativeLayout.TRUE); // 水平居中
69. addView(containerLayout, containerParams); // 当前布局增加容器
布局
70.if (0 != bgImageResId) {
71. mBgImage = new ImageView(mContext); // 创建item背景图片
72. mBgImage.setImageResource(bgImageResId); // 设置item背景
图片
73. LayoutParams imageParams = new LayoutParams(
74. LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CO
NTENT); // 宽度WRAP_CONTENT,高度WRAP_CONTENT
75. imageParams.addRule(RelativeLayout.CENTER_VERTICAL,
76. RelativeLayout.TRUE); // 垂直居中
77. imageParams.leftMargin = bgLeftMargin; // 左边距
78. containerLayout.addView(mBgImage, imageParams); // 标题
栏容器增加标题item背景图片
79. }
80.if (titleLayoutId != 0) {
81. titleLayout = mInflater.inflate(titleLayoutId, this, fa
lse); // 获得标题栏布局
82. LayoutParams titleParams = new LayoutParams(
83. LayoutParams.FILL_PARENT, LayoutParams.WRAP_CON
TENT); // 宽度WRAP_CONTENT,高度WRAP_CONTENT
84. titleParams.addRule(RelativeLayout.CENTER_HORIZONTAL,
85. RelativeLayout.TRUE); // 水平居中
86. titleParams.addRule(RelativeLayout.CENTER_VERTICAL,
87. RelativeLayout.TRUE); // 垂直居中
88. containerLayout.addView(titleLayout, titleParams); //
标题栏容器增加标题栏布局
89. }
90. mViewPager = new ViewPager(mContext); // 创建ViewPager
91. mViewPager.setAdapter(new MPagerAdapter()); // 设置
ViewPager适配器
92. mViewPager.setOnPageChangeListener(this); // 设置页面改变的监
听接口
93. LayoutParams viewPagerParams = new LayoutParams(
94. LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)
; // 宽度FILL_PARENT,高度FILL_PARENT
95. viewPagerParams.addRule(RelativeLayout.BELOW, containerLayo
ut.getId()); // 布于标题栏容器下方
96. viewPagerParams.addRule(RelativeLayout.CENTER_HORIZONTAL,
97. RelativeLayout.TRUE); // 水平居中
98. addView(mViewPager, viewPagerParams); // 当前布局增加容器
ViewPager
99. }
100.
101.// 增加一个绑定页面
102.public void addBindedPage(int pageViewId, int titleItem Id) {
103. mPageViews.add(mInflater.inflate(pageViewId, this, false));
104. View item = titleLayout.findViewById(titleItemId);
105. item.setOnClickListener(this);
106. mItemViews.add(item);
107. }
108.
109.// 获得页面数量
110.public int getCount() {
111.return mPageViews.size();
112. }
113.
114.// 初始化页面(需要在UI加载完后,可以覆写
onWindowFocusChanged())
115.public void setPage(int index) {
116. setImagePosition(index); // 设置图像至标题项位置
117. mViewPager.setCurrentItem(index, false); // 设置ViewPager当前页面
118. }
119.
120.// 设置当前页面
121.public void setCurrentPage(int index, boolean isAnim) {
122. previousIndex = currentIndex; // 记录前次页面索引123. currentIndex = index; // 设置当前页面索引
124. mViewPager.setCurrentItem(index, isAnim); // 设置ViewPager当前页面
125.// Title移动绑定在ViewPager的滚动事件内
126. }
127.
128.// 设置图像至标题项位置
129.private void setImagePosition(int index) {
130. previousIndex = currentIndex; // 记录前次页面索引131. currentIndex = index; // 设置当前页面索引
132.if (null == mBgImage) {
133.return;
134. }
135. LayoutParams params = (https://www.sodocs.net/doc/2b7007089.html,youtParams) mBgImage
136. .getLayoutParams(); // 获得图片布局
137. View item = mItemViews.get(index); // 标题项
138.// 注:UI加载完后getLeft()才有值
139.int targetLeftMargin = (int) (item.getLeft() + item .getWidth() / 2.0 - mBgImage
140. .getWidth() / 2.0); // 目标左边距
141.// 位置未变时直接返回,以避免多次setLayoutParams(...) 142.if (params.leftMargin == targetLeftMargin) {
143.return;
144. }
145. params.leftMargin = targetLeftMargin;
146. mBgImage.setLayoutParams(params); // 使设置生效
147. }
148.
149.// 设置图像移动像素距离
150.private void moveImagePosition(int offset) {
151.if (null == mBgImage) {
152.return;
153. }
154. LayoutParams params = (https://www.sodocs.net/doc/2b7007089.html,youtParams) mBgImage
155. .getLayoutParams(); // 获得图片布局
156. params.leftMargin += offset;
157. mBgImage.setLayoutParams(params); // 使设置生效
158. }
159.
160./*
161. * 当前页滚动时调用,无论是程序控制的平滑滚动还是用户发起的触摸滚动。
162. * arg0:第一个页面当前显示的位置索引。如果页面偏移不是0,下一个页面将会可见。
163. * arg1:表示第二个页面位置偏移量的比例值,[0, 1)。(右侧页面所占屏幕百分比)
164. * arg2:表示第二个页面位置偏移量的像素值。(右侧页面距右边的像素值)
165. */
166.@Override
167.public void onPageScrolled(int position, float position Offset,
168.int positionOffsetPixels) {
169.// 判断是否不在动画,用positionOffsetPixels判断判断原因是:
170.// 1)position,在选中了页面时就会改变,自动动画时的不能判断171.// 2)positionOffset,动画完变为0.0,但float不好直接等于判断
172.// 3)positionOffsetPixels,动画完变为0,int型^^
173.if (positionOffsetPixels == 0) {
174. setImagePosition(position);
175. prevOffset = -1;
176. isTitleClicked = false;
177.return;
178. }
179.// 刚移动时,记录下该次值
180.if (prevOffset == -1) {
181. prevOffset = positionOffsetPixels;
182.return;
183. }
184.int pageOffset = positionOffsetPixels - prevOffset;
// 页面偏移距离
185. prevOffset = positionOffsetPixels;
186.if (null != mBgImage) {
187.try {
188.if (pageOffset < 0) { // 左->右
189.int prevIndex, nextIndex;
190.if (isTitleClicked) {
191. prevIndex = previousIndex;
192. nextIndex = currentIndex;
193. } else {
194. prevIndex = currentIndex;
195. nextIndex = currentIndex - 1; 196. }
197.// 两菜单项间的距离
198.int itemDistance = mItemViews.get(prevI ndex).getLeft()
199. - mItemViews.get(nextIndex).get Left();
200.// 图片偏移距离
201.int imageOffset = pageOffset * itemDist ance
202. / mViewPager.getWidth();
203.// 设置图像移动像素距离
204. moveImagePosition(imageOffset);
205. } else if (pageOffset > 0) { // 右->左
206.int prevIndex, nextIndex;
207.if (isTitleClicked) {
208. prevIndex = previousIndex;
209. nextIndex = currentIndex;
210. } else {
211. prevIndex = currentIndex;
212. nextIndex = currentIndex + 1; 213. }
214.// 两菜单项间的距离
215.int itemDistance = mItemViews.get(nextI ndex).getLeft()
216. - mItemViews.get(prevIndex).get Left();
217.// 图片偏移距离
218.int imageOffset = pageOffset * itemDist ance
219. / mViewPager.getWidth();
220.// 设置图像移动像素距离
221. moveImagePosition(imageOffset);
222. }
223. } catch (IndexOutOfBoundsException e) {
224.// 类似在中间左右左右的来回拖拽==,判断还不够啊T^T 225. setImagePosition(currentIndex);
226. isTitleClicked = false;
227. }
228. }
229.if (null != mOnPageChangeListener) {
230. mOnPageChangeListener.onPageScrolled(position, positionOffset,
231. positionOffsetPixels);
232. }
233. }
234.
235./*
236. * 当一个新页面被选中时被调用。动画不一定必须完成。
237. * arg0:新选中页面的位置索引
238. */
239.@Override
240.public void onPageSelected(int position) {
241.if (null != mOnPageChangeListener) {
242. mOnPageChangeListener.onPageSelected(position);
243. }
244. }
245.
246./*
247. * 滚动状态改变时调用。用于发现用户何时开始拖动、页面何时自动沉降到当前页(用户不拖动时)、或者何时完全停止/空闲。
248. * arg0:新的滚动状态。SCROLL_STATE_DRAGGING、SCROLL_STATE_SETTLING、SCROLL_STATE_IDLE
249. */
250.@Override
251.public void onPageScrollStateChanged(int state) {
252.if (state == ViewPager.SCROLL_STATE_DRAGGING) { // 用户拖动时
253. isTitleClicked = false;
254. }
255.if (null != mOnPageChangeListener) {
256. mOnPageChangeListener.onPageScrollStateChanged( state);
257. }
258. }
259.
260.// 自定义的ViewPager适配器
261.private class MPagerAdapter extends PagerAdapter { 262.
263./*
264. * 移除一个给定位置的页面。适配器有责任从它的容器中移除视图,虽然这仅必须确认动作是在finishUpdate()后按时间完成的。
265. * arg0:容器视图,从中将移除页面。
266. * arg1:移除的页面位置
267. * arg2:和instantiateItem(View, int)返回的一样的对象268. */
269.@Override
270.public void destroyItem(View arg0, int arg1, Object arg2) {
271. ((ViewPager) arg0).removeView(mPageViews.get(ar g1));
272. }
273.
274./*
275. * 当显示的界面完成变化后调用。在这里,你应当必须确保所有的页面已经真正的从容器中增加或删除。
276. * arg0:容器视图,用于显示适配器的页面视图
277. */
278.@Override
279.public void finishUpdate(View arg0) {
280. }
281.
282.// 返回可用界面的数量
283.@Override
284.public int getCount() {
285.return mPageViews.size();
286. }
287.
288./*
289. * 创建一个给定位置的界面。适配器有责任给这边给出的容器增加一个视图,虽然这仅必须确认动作是在finishUpdate()后按时间完成的。
290. * arg0:容器视图,在里面将显示页面。
291. * arg1:要被装载的页面位置
292. * Object:返回一个展现新画面的对象。这不必须是一个View,也可以是一些其他的页面容器。
293. */
294.@Override
295.public Object instantiateItem(View arg0, int arg1) {
296. ((ViewPager) arg0).addView(mPageViews.get(arg1) , 0);
297.return mPageViews.get(arg1);
298. }
299.
300.// 是否是由对象生成的视图
301.@Override
302.public boolean isViewFromObject(View arg0, Object a rg1) {
303.return arg0 == (arg1);
304. }
305.
306.// 恢复状态
307.@Override
308.public void restoreState(Parcelable arg0, ClassLoad er arg1) {
309. }
310.
311.// 保存状态,返回序列化对象
312.@Override
313.public Parcelable saveState() {
314.return null;
315. }
316.
317./*
318. * 当显示的页面将要开始变化时调用
319. * arg0:容器视图,用于显示适配器的页面视图
320. */
321.@Override
322.public void startUpdate(View arg0) {
323. }
324. }
325.
326.@Override
327.public void onClick(View v) {
328.int size = mItemViews.size(); // 大小
329.for (int i = 0; i < size; i++) {
330.if (mItemViews.get(i).getId() == v.getId()) {
331. isTitleClicked = true;
332. setCurrentPage(i, true);
333.break;
334. }
335. }
336. }
337.
338.// 获得标题项视图集合
339.public ArrayList
340.return mItemViews;
341. }
342.
343.// 获得页面视图集合
344.public ArrayList
345.return mPageViews;
346. }
347.
348.// 设置页面变化监听事件
349.public void setOnPageChangeListener(OnPageChangeListene r listener) {
350. mOnPageChangeListener = listener;
351. }
352.
353.}
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.sodocs.net/doc/2b7007089.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.sodocs.net/doc/2b7007089.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.sodocs.net/doc/2b7007089.html,yout.by_baseinfo); dialog.setTitle("dialog的title"); /* * 获取Dialog的窗口对象及参数对象以修改对话框的布局设置, 可以直接调用this.getWindow(),表示获得这个Activity的Window * 对象,这样这可以以同样的方式改变这个Activity的属性. * Activity不可见时getWindow()返回值为null; */ Window dialogWindow = dialog.getWindow(); // 对话框的布局设置参数; https://www.sodocs.net/doc/2b7007089.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.sodocs.net/doc/2b7007089.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.sodocs.net/doc/2b7007089.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.sodocs.net/doc/2b7007089.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常用控件
android 自定义控件的过程
android常用控件大全
Android进阶——自定义View之自己绘制彩虹圆环调色板
android自定义布局或View
Android自定义控件
实验二 android基本控件实验
android自定义View之Android手机通讯录制作
Android自定义View
Android基础-控件的使用
基于Android的自定义媒体播放控件设计与实现
Android应用开发基础习题
自定义Android带图片的按钮
android 控件常用属性
Android中自定义ListView控件实现下拉刷新,简单实用效果好(原创)