Android实现图片滚动控件
实现原理其实还是之前那篇文章Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现,算是以那个原理为基础的另外一个变种。正所谓一通百通,真正掌握一种方法之后,就可以使用这个方法变换出各种不通的效果。
今天仍然还是实现一个自定义控件,然后我们在任意Activity的布局文件中引用一下,即可实现图片滚动器的效果。
在Eclipse中新建一个Android项目,项目名就叫做SlidingViewSwitcher。
新建一个类,名叫SlidingSwitcherView,这个类是继承自RelativeLayout的,并且实现了OnTouchListener接口,具体代码如下:
[java]view plaincopy
1.public class SlidingSwitcherView extends RelativeLayout i
mplements OnTouchListener {
2.
3./**
4. * 让菜单滚动,手指滑动需要达到的速度。
5. */
6.public static final int SNAP_VELOCITY = 200;
7.
8./**
9. * SlidingSwitcherView的宽度。
10. */
11.private int switcherViewWidth;
12.
13./**
14. * 当前显示的元素的下标。
15. */
16.private int currentItemIndex;
17.
18./**
19. * 菜单中包含的元素总数。
20. */
21.private int itemsCount;
22.
23./**
24. * 各个元素的偏移边界值。
25. */
26.private int[] borders;
27.
28./**
29. * 最多可以滑动到的左边缘。值由菜单中包含的元素总数来定,
marginLeft到达此值之后,不能再减少。
30. *
31. */
32.private int leftEdge = 0;
33.
34./**
35. * 最多可以滑动到的右边缘。值恒为0,marginLeft到达此值之
后,不能再增加。
36. */
37.private int rightEdge = 0;
38.
39./**
40. * 记录手指按下时的横坐标。
41. */
42.private float xDown;
43.
44./**
45. * 记录手指移动时的横坐标。
46. */
47.private float xMove;
48.
49./**
50. * 记录手机抬起时的横坐标。
51. */
52.private float xUp;
53.
54./**
55. * 菜单布局。
56. */
57.private LinearLayout itemsLayout;
58.
59./**
60. * 标签布局。
61. */
62.private LinearLayout dotsLayout;
63.
64./**
65. * 菜单中的第一个元素。
66. */
67.private View firstItem;
68.
69./**
70. * 菜单中第一个元素的布局,用于改变leftMargin的值,来决
定当前显示的哪一个元素。
71. */
72.private MarginLayoutParams firstItemParams;
73.
74./**
75. * 用于计算手指滑动的速度。
76. */
77.private VelocityTracker mVelocityTracker;
78.
79./**
80. * 重写SlidingSwitcherView的构造函数,用于允许在XML中
引用当前的自定义布局。
81. *
82. * @param context
83. * @param attrs
84. */
85.public SlidingSwitcherView(Context context, Attribut
eSet attrs) {
86.super(context, attrs);
87. }
88.
89./**
90. * 滚动到下一个元素。
91. */
92.public void scrollToNext() {
93.new ScrollTask().execute(-20);
94. }
95.
96./**
97. * 滚动到上一个元素。
98. */
99.public void scrollToPrevious() {
100.new ScrollTask().execute(20);
101. }
102.
103./**
104. * 在onLayout中重新设定菜单元素和标签元素的参数。105. */
106.@Override
107.protected void onLayout(boolean changed, int l, i nt t, int r, int b) {
108.super.onLayout(changed, l, t, r, b);
109.if (changed) {
110. initializeItems();
111. initializeDots();
112. }
113. }
114.
115./**
116. * 初始化菜单元素,为每一个子元素增加监听事件,并且改变所有子元素的宽度,让它们等于父元素的宽度。
117. */
118.private void initializeItems() {
119. switcherViewWidth = getWidth();
120. itemsLayout = (LinearLayout) getChildAt(0); 121. itemsCount = itemsLayout.getChildCount(); 122. borders = new int[itemsCount];
123.for (int i = 0; i < itemsCount; i++) { 124. borders[i] = -i * switcherViewWidth; 125. View item = itemsLayout.getChildAt(i); 126. MarginLayoutParams params = (MarginLayout Params) item.getLayoutParams();
127. params.width = switcherViewWidth;
128. item.setLayoutParams(params);
129. item.setOnTouchListener(this);
130. }
131. leftEdge = borders[itemsCount - 1];
132. firstItem = itemsLayout.getChildAt(0); 133. firstItemParams = (MarginLayoutParams) firstI tem.getLayoutParams();
134. }
135.
136./**
137. * 初始化标签元素。
138. */
139.private void initializeDots() {
140. dotsLayout = (LinearLayout) getChildAt(1); 141. refreshDotsLayout();
142. }
143.
144.@Override
145.public boolean onTouch(View v, MotionEvent event) {
146. createVelocityTracker(event);
147.switch (event.getAction()) {
148.case MotionEvent.ACTION_DOWN:
149.// 手指按下时,记录按下时的横坐标
150. xDown = event.getRawX();
151.break;
152.case MotionEvent.ACTION_MOVE:
153.// 手指移动时,对比按下时的横坐标,计算出移动的距离,来调整左侧布局的leftMargin值,从而显示和隐藏左侧布局154. xMove = event.getRawX();
155.int distanceX = (int) (xMove - xDown) - ( currentItemIndex * switcherViewWidth);
156. firstItemParams.leftMargin = distanceX; 157.if (beAbleToScroll()) {
158. firstItem.setLayoutParams(firstItemPa rams);
159. }
160.break;
161.case MotionEvent.ACTION_UP:
162.// 手指抬起时,进行判断当前手势的意图,从而决定是滚动到左侧布局,还是滚动到右侧布局
163. xUp = event.getRawX();
164.if (beAbleToScroll()) {
165.if (wantScrollToPrevious()) {
166.if (shouldScrollToPrevious()) { 167. currentItemIndex--;
168. scrollToPrevious();
169. refreshDotsLayout();
170. } else {
171. scrollToNext();
172. }
173. } else if (wantScrollToNext()) { 174.if (shouldScrollToNext()) { 175. currentItemIndex++;
176. scrollToNext();
177. refreshDotsLayout();
178. } else {
179. scrollToPrevious();
180. }
181. }
182. }
183. recycleVelocityTracker();
184.break;
185. }
186.return false;
187. }
188.
189./**
190. * 当前是否能够滚动,滚动到第一个或最后一个元素时将不能再滚动。
191. *
192. * @return 当前leftMargin的值在leftEdge和rightEdge之间返回true,否则返回false。
193. */
194.private boolean beAbleToScroll() {
195.return firstItemParams.leftMargin < rightEdge && firstItemParams.leftMargin > leftEdge;
196. }
197.
198./**
199. * 判断当前手势的意图是不是想滚动到上一个菜单元素。如果手指移动的距离是正数,则认为当前手势是想要滚动到上一个菜单元素。200. *
201. * @return 当前手势想滚动到上一个菜单元素返回true,否则返回false。
202. */
203.private boolean wantScrollToPrevious() {
204.return xUp - xDown > 0;
205. }
206.
207./**
208. * 判断当前手势的意图是不是想滚动到下一个菜单元素。如果手指移动的距离是负数,则认为当前手势是想要滚动到下一个菜单元素。209. *
210. * @return 当前手势想滚动到下一个菜单元素返回true,否则返回false。
211. */
212.private boolean wantScrollToNext() {
213.return xUp - xDown < 0;
214. }
215.
216./**
217. * 判断是否应该滚动到下一个菜单元素。如果手指移动距离大于屏幕的1/2,或者手指移动速度大于SNAP_VELOCITY,
218. * 就认为应该滚动到下一个菜单元素。
219. *
220. * @return 如果应该滚动到下一个菜单元素返回true,否则返回false。
221. */
222.private boolean shouldScrollToNext() {
223.return xDown - xUp > switcherViewWidth / 2 || getScrollVelocity() > SNAP_VELOCITY;
224. }
225.
226./**
227. * 判断是否应该滚动到上一个菜单元素。如果手指移动距离大于屏幕的1/2,或者手指移动速度大于SNAP_VELOCITY,
228. * 就认为应该滚动到上一个菜单元素。
229. *
230. * @return 如果应该滚动到上一个菜单元素返回true,否则返回false。
231. */
232.private boolean shouldScrollToPrevious() { 233.return xUp - xDown > switcherViewWidth / 2 || getScrollVelocity() > SNAP_VELOCITY;
234. }
235.
236./**
237. * 刷新标签元素布局,每次currentItemIndex值改变的时候都应该进行刷新。
238. */
239.private void refreshDotsLayout() {
240. dotsLayout.removeAllViews();
241.for (int i = 0; i < itemsCount; i++) { 242. https://www.360docs.net/doc/d13996736.html,youtParams linearParams = new https://www.360docs.net/doc/d13996736.html,youtParams(0,
243. LayoutParams.FILL_PARENT); 244. linearParams.weight = 1;
245. RelativeLayout relativeLayout = new Relat iveLayout(getContext());
246. ImageView image = new ImageView(getContex t());
247.if (i == currentItemIndex) {
248. image.setBackgroundResource(R.drawabl
e.dot_selected);
249. } else {
250. image.setBackgroundResource(R.drawabl
e.dot_unselected);
251. }
252. https://www.360docs.net/doc/d13996736.html,youtParams relativeParam s = new https://www.360docs.net/doc/d13996736.html,youtParams(
253. LayoutParams.WRAP_CONTENT, Layout Params.WRAP_CONTENT);
254. relativeParams.addRule(RelativeLayout.CEN TER_IN_PARENT);
255. relativeLayout.addView(image, relativePar ams);
256. dotsLayout.addView(relativeLayout, linear Params);
257. }
258. }
259.
260./**
261. * 创建VelocityTracker对象,并将触摸事件加入到VelocityTracker当中。
262. *
263. * @param event
264. * 右侧布局监听控件的滑动事件
265. */
266.private void createVelocityTracker(MotionEvent ev ent) {
267.if (mVelocityTracker == null) {
268. mVelocityTracker = VelocityTracker.obtain ();
269. }
270. mVelocityTracker.addMovement(event);
271. }
272.
273./**
274. * 获取手指在右侧布局的监听View上的滑动速度。
275. *
276. * @return 滑动速度,以每秒钟移动了多少像素值为单位。277. */
278.private int getScrollVelocity() {
279. https://www.360docs.net/doc/d13996736.html,puteCurrentVelocity(1000) ;
280.int velocity = (int) mVelocityTracker.getXVel ocity();
281.return Math.abs(velocity);
282. }
283.
284./**
285. * 回收VelocityTracker对象。
286. */
287.private void recycleVelocityTracker() {
288. mVelocityTracker.recycle();
289. mVelocityTracker = null;
290. }
291.
292./**
293. * 检测菜单滚动时,是否有穿越border,border的值都存储在{@link #borders}中。
294. *
295. * @param leftMargin
296. * 第一个元素的左偏移值
297. * @param speed
298. * 滚动的速度,正数说明向右滚动,负数说明向左滚动。
299. * @return 穿越任何一个border了返回true,否则返回false。
300. */
301.private boolean isCrossBorder(int leftMargin, int speed) {
302.for (int border : borders) {
303.if (speed > 0) {
304.if (leftMargin >= border && leftMargi n - speed < border) {
305.return true;
306. }
307. } else {
308.if (leftMargin <= border && leftMargi n - speed > border) {
309.return true;
310. }
311. }
312. }
313.return false;
314. }
315.
316./**
317. * 找到离当前的leftMargin最近的一个border值。318. *
319. * @param leftMargin
320. * 第一个元素的左偏移值
321. * @return 离当前的leftMargin最近的一个border值。322. */
323.private int findClosestBorder(int leftMargin) { 324.int absLeftMargin = Math.abs(leftMargin); 325.int closestBorder = borders[0];
326.int closestMargin = Math.abs(Math.abs(closest Border) - absLeftMargin);
327.for (int border : borders) {
328.int margin = Math.abs(Math.abs(border) - absLeftMargin);
329.if (margin < closestMargin) {
330. closestBorder = border;
331. closestMargin = margin;
332. }
333. }
334.return closestBorder;
335. }
336.
337.class ScrollTask extends AsyncTask
338.
339.@Override
340.protected Integer doInBackground(Integer... s peed) {
341.int leftMargin = firstItemParams.leftMarg in;
342.// 根据传入的速度来滚动界面,当滚动穿越border 时,跳出循环。
343.while (true) {
344. leftMargin = leftMargin + speed[0]; 345.if (isCrossBorder(leftMargin, speed[0 ])) {
346. leftMargin = findClosestBorder(le ftMargin);
347.break;
348. }
349. publishProgress(leftMargin);
350.// 为了要有滚动效果产生,每次循环使线程睡眠10毫秒,这样肉眼才能够看到滚动动画。
351. sleep(10);
352. }
353.return leftMargin;
354. }
355.
356.@Override
357.protected void onProgressUpdate(Integer... le ftMargin) {
358. firstItemParams.leftMargin = leftMargin[0 ];
359. firstItem.setLayoutParams(firstItemParams );
360. }
361.
362.@Override
363.protected void onPostExecute(Integer leftMarg in) {
364. firstItemParams.leftMargin = leftMargin;
365. firstItem.setLayoutParams(firstItemParams );
366. }
367. }
368.
369./**
370. * 使当前线程睡眠指定的毫秒数。
371. *
372. * @param millis
373. * 指定当前线程睡眠多久,以毫秒为单位
374. */
375.private void sleep(long millis) {
376.try {
377. Thread.sleep(millis);
378. } catch (InterruptedException e) {
379. e.printStackTrace();
380. }
381. }
382.}
细心的朋友可以看出来,我还是重用了很多之前的代码,这里有几个重要点我说一下。在onLayout 方法里,重定义了各个包含图片的控件的大小,然后为每个包含图片的控件都注册了一个touch事件监听器。这样当我们滑动任何一样图片控件的时候,都会触发onTouch事件,然后通过改变第一个图片控件的leftMargin,去实现动画效果。之后在onLayout里又动态加入了页签View,有几个图片控件就会加入几个页签,然后根据currentItemIndex来决定高亮显示哪一个页签。其它也没什么要特别说明的了,更深的理解大家去看代码和注释吧。
然后看一下布局文件中如何使用我们自定义的这个控件,创建或打开activity_main.xml,里面加入如下代码:
1. 2.xmlns:tools="https://www.360docs.net/doc/d13996736.html,/tools" 3.android:layout_width="fill_parent" 4.android:layout_height="fill_parent" 5.android:orientation="horizontal" 6.tools:context=".MainActivity"> 7. 8. 9.android:id="@+id/slidingLayout" 10.android:layout_width="fill_parent" 11.android:layout_height="100dip"> 12. 13. 14.android:layout_width="fill_parent" 15.android:layout_height="fill_parent" 16.android:orientation="horizontal"> 17. 18. 38. 39. 40.android:layout_width="60dip" 41.android:layout_height="20dip" 42.android:layout_alignParentBottom="true" 43.android:layout_alignParentRight="true" 44.android:layout_margin="15dip" 45.android:orientation="horizontal"> 46. 47. 48. 49.
我们可以看到,com.example.viewswitcher.SlidingSwitcherView的根目录下放置了两个LinearLayout。第一个LinearLayout中要放入需要滚动显示的图片,这里我们加入了四个Button,每个Button都设置了一张背景图片。第二个LinearLayout中不需要加入任何东西,只要控制好大小和位置,标签会在运行的时候自动加入到这个layout中。
然后创建或打开MainActivity作为主界面,里面没有加入任何新增的代码:
[java]view plaincopy
1.public class MainActivity extends Activity {
2.
3.@Override
4.protected void onCreate(Bundle savedInstanceState) {
5.super.onCreate(savedInstanceState);
6. setContentView(https://www.360docs.net/doc/d13996736.html,yout.activity_main);
7. }
8.
9.}
最后是给出AndroidManifest.xml的代码,也都是自动生成的内容:
[html]view plaincopy
1.
2. 3.package="com.example.viewswitcher" 4.android:versionCode="1" 5.android:versionName="1.0"> 6. 7. 8.android:minSdkVersion="8" 9.android:targetSdkVersion="8"/> 10. 11. 12.android:allowBackup="true" 13.android:icon="@drawable/ic_launcher" 14.android:label="@string/app_name" 15.android:theme="@android:style/Theme.NoTitleBar" > 16. 17.android:name="com.example.viewswitcher.MainA ctivity" 18.android:label="@string/app_name"> 19. 20. 21. 22. 23. 24. 25. 26. 27.
android 自定义圆角头像以及使用declare-styleable进行配置属性解析
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 控件常用属性
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毕业设计(论文)开题报告
毕业设计(论文) 开题报告 题目___________________________ 学院___________________________ 专业及班级___________________________ 姓名___________________________ 学号___________________________ 指导教师 ___________________________ 日期 ___________________________
西安科技大学毕业设计(论文)开题报告
二、主要研究(设计)内容、研究(设计)思路及工作方法或工作流程 设计内容:基于Android平台下实现理货员的功能:精耕拜访,销售机会,拜访效果,门店销量查询,待办事项,数据维护:队列信息,基础信息,地图下载。 设计思路及工作方法: 1.精耕拜访: (1)初始进入该页面,系统会自动获取该理货员的本日拜访的门店及路线。 (2)下方地图会自动定位目前理货员的位置。 (3)点击门店的具体门店名称,在右边会显示该门店的联系人,电话,及地址,并且地图 会自动切换定位以该门店为中心。 (4)点击地图上的+可实现地图局部放大。-可实现地图的放小。 (5)如已拜访的门店,点击进入可以调去历史拜访数据。如未拜访的门店,点击进入可以新增该拜访记录。 (6)如理货员在拜访期间,发现门店已经有卖而目前系统中无记录的情况,则可以通过扫 描SKU的条形码,系统会自动匹配该SKU的信息给理货员。 匹配顺序:连锁总店—区域管理—基本SKU信息 补充说明: (1)公司动态内容,为了显示保乐力加集团的整体形象,有必要对公司的动态进行展示。 要包括集团的光辉历程,门店信息,集团的促销信息等。 (2)在陈列信息栏中,有其它途径过来的回应确认,可以一栏展示在上半部。如该理货员 需要发起确认,也可以通过点击发起确认进行提出。发起确认的需要销售员进行审核并且 分发。 (3)陈列报告,为显示每次理货员必须处理的门店信息记录及图片等。 (4)在陈列信息栏中,有其它途径过来的回应确认,可以一栏展示在上半部。如该理货员需要发起确认,也可以通过点击发起确认进行提出。发起确认的需要销售员进行审核并且分发。 (5)价格显示,系统会自动带出竞品信息。罗列在下半部。理货员在进行拜访期间,可以对本身的SKU及竞品的价格进行登记。主要登记内容:零售价格,促销价格及促销期间。信息采集完毕,可以供后台进行统计分析。 (7)在陈列信息栏中,有其它途径过来的回应确认,可以一栏展示在上半部。如该理货员需要发起确认,也可以通过点击发起确认进行提出。发起确认的需要销售员进行审核并且分发。 (7)库存信息,主要记录SKU的库存数量。 (8)上半部为助销申请内容,主要是对一些礼品的申请。 (9)订单处理,为新增订单,退货内容及换货内容的跟踪。 2.销售机会: (1)打开销售机会界面,会自动定位目前的门店列表。 (2)用户可以输入门店名称查询具体的门店信息及地图位置。
Android平台我的日记设计文档
Android平台我的日记 设计文档 项目名称:mydiray 项目结构示意: 阶段任务名称(一)布局的设计 开始时间: 结束时间: 设计者: 梁凌旭 一、本次任务完成的功能 1、各控件的显示 二、最终功能及效果 三、涉及知识点介绍 四、代码设计 activity_main.xml: android:layout_centerHorizontal="true" android:layout_marginTop="88dp" android:text="@string/wo" android:textSize="35sp"/> 任务一 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.VB 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应用程序,设置应用程序名、Android版本等基本信息。 我们做Android 程序的时候,有时候需要显示图片在界面上,这里我们将实现一个将图片展示到手机屏幕,并让其不停的浮动的效果! 首先我们要先准备一张图片,在这里我准备了一张图片,如下: 将此图片放到文件夹"res->drawable-*dpi"下,记得,三个文件夹都要放,因为系统会根据不同的分辨率去取不同的图片,如果有的没放,在某些分辨率下,会找不到资源。将此图片重命名为“pic.png”,在R.java里的drawable 类里会生成一个pic的常量。 图片要显示,就是要容器可以让其显示,因为所有的Android的UI组件都是继承自View,View也实现了Drawable接口,所以在此,我们也重新定义一个View让其用来显示我们的这张图片,并让这张图片浮动。我们创建一个在包“org.leo.bitmap”下的,类名为“MovingPictureView”的类,该类继承自android.view.View。此类目前代码大致如下: public class MovingPictureView extends View { public MovingPictureView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } } 我们要重载他的“onDraw”方法,这个方法就是Android框架展现View的时候用来绘制显示内容那个的方法。在此我们将他的所有方法体都删除掉(上面代码红色部分删掉),完全将其重写。首先我们要创建一个图片对象,在Android里,所有位图图片都是使用Bitmap类来封装的,我们就先声明一个代表我们刚才图片的一个Bitmap对象,可通过以下方式声明: Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic); 其中的“getResources()”方法,是有View提供的,可以根据此方法获得我们所有的资源,将来有机会再细说! 《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/d13996736.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的selector背景选择器 ---------------------------------------------------- Item顺序是有讲究的,条件限定越细致,则应该放到前面。比如这儿如果把1,2行和3,4行的item交换,那么pressed的就永远无法触发了,因为有item已经满足条件返回了。可以理解为代码中的if语句。 ---------------------------------------------------- 关于listview和button都要改变android原来控件的背景,在网上查找了一些资料不是很全,所以现在总结一下android的selector的用法。 首先android的selector是在drawable/xxx.xml中配置的。 先看一下listview中的状态: 把下面的XML文件保存成你自己命名的.xml文件(比如list_item_bg.xml),在系统使用时根据ListView中的列表项的状态来使用相应的背景图片。 drawable/list_item_bg.xml 如何用Android用ImageView显示本地和网上 的图片说明 Android:ImageView如何显示网络图片 本文地址:https://www.360docs.net/doc/d13996736.html,/programmar/blog/item/79483ecb2ac75cf552664fd3.html在 Android中显示一张网络图片其实是超级简单的,下面就一个非常简单的例子: Step1: 1、创建你的Activity,本例中以ViewWebImageActivity说明; 2、ViewWebImageActivity中的代码如下: String imageUrl = "https://www.360docs.net/doc/d13996736.html,/baidu/pic/item/7d8aebfebf3f9e125c6008d8.jpg"; //这就是你需要显示的网络图片---网上随便找的 Bitmap bmImg; ImageView imView; Button button1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.360docs.net/doc/d13996736.html,yout.main); imView = (ImageView) findViewById(R.id.imview); imView.setImageBitmap(returnBitMap(imageUrl)); } public Bitmap returnBitMap(String url) { URL myFileUrl = null; Bitmap bitmap = null; try { myFileUrl = new URL(url); } catch (MalformedURLException e) { e.printStackTrace(); } try { HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection(); conn.setDoInput(true); conn.connect(); 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/d13996736.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方法实现基本的交互 定义回调接口供外部调用 二、彩虹圆环调色板设计思想 话不多说,直接切入正题 一、Android中消除preference拖拉时黑色背景方法: 首先建立一个preference_list.xml 代码如下: 1. Canvas类用来实现绘制.通过组合使用Canva s类的成员函数可以实现随心随欲地绘制图片的任何部分. Canvas.clipRect:设置显示区域 Canvas.drawBitmap:绘制 例子: Bitmap b=Bitma pFactory.decodeStream("图片编号", null);//读取图片 ... Canvas c = null;//实例Canvas c.save();//记录原来的ca nvas状态 c.clipRect(100,100,200,300);//显示从(100,100)到(200,300)的区域(单位:象素) c.drawBitmap(b,10,0,null); //将阉割过的图片画到(10,0)位置 c.restore();//恢复canva s状态 2. android 从sdcard 读取图片剪切粘贴 文章分类:移动开发 android 图片编辑时需要从外界(sdcard ,res/.png...,xml)读取图片到画布,其中从sdcard读取图片到画布的过程如下: public void drawBitMapFromSDcard(String dir) { if(dir ==null || dir.equals("")){ return ; } bitMap = BitmapFactory.decodeFile(dir); int width = bitMap.getWidth(); int height = bitMap.getHeight(); 如果图片像素太大超过手机屏幕大小可以按照手机屏比例进行缩放 if (width > 320 && height > 480) { int newWidth = 320; int newHeight = 480; float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; float minScale = Math.min(scaleWidth, scaleHeight); matrix = new Matrix(); 自定义Dialog; dialog = new Dialog(this); dialog.setContentView(https://www.360docs.net/doc/d13996736.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/d13996736.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 开发环境的搭建 第一部分知识回顾与思考 1.Android 的四层架构分别包括哪几层?分别起到什么作用? 答:Linux 内核层(Linux Kernel ):基于Linux 内核,内核为上层系统提供了系统服务。 系统库层(Libraries ):系统库基于C/C++ 语言实现,通过接口向应用程序框架层提供编程接口。 应用框架层(Application Framework ):为开发者提供了一系列的Java API,包括图形用户界面组件 View 、SQLite 数据库相关的API 、Service 组件等。 应用程序层(Applications ):包含了Android 平台中各式各样的应用程序。 第二部分职业能力训练 一、单项选择题(下列答案中有一项是正确的,将正确答案填入括号内) 1.Android 四层架构中,应用框架层使用的是什么语法?(C)A .CB .C++C.Java D.Android 2.Android 四层架构中,系统库层使用的是什么语法?(B)A .VBB.C /C++C.Java D .Android 3.应用程序员编写的Android 应用程序,主要是调用(B)提供的接口进行实现。 A .应用程序层DCB.应用框架层.应用视图层.系统库层 二、填空题(请在括号内填空) 1.在Android 智能终端中,有很多应用如拍照软件、联系人管理软件,它们都属于Android 的(应用程 序)层。 2.为了让程序员更加方便的运行调试程序,Android 提供了(模拟器),可以方便的将程序运行其上, 而不要实际的移动终端。 程序运行,我们需要安装(Java 3.为了支持)。JDK 三、简答题 1.简述Android 开发环境安装的步骤。 答:下载并安装JDK ,配置JDK 的环境变量; 从Anroid 官网上下载Android 开发组件(包含Eclipse 和 Android 标题栏添加控件及Button控件背景颜色的设置 一、Android中标题栏添加按 现在很多的Android程序都在标题栏上都显示了一些按钮和标题,如下图: 下面通过实例来看一下如何实现。 1、在layout下创建一个titlebtn.xml文件,内容如下: 看到很多人在问如何实现三维的翻转效果,所以今天在这里简单的给大家分析一下,其实在APIDemo中就有这样一个例子,那么我们就以其为例来学习Android中的翻转动画效果的实现,首先看一下运行效果如下图所示。 Android中并没有提供直接做3D翻转的动画,所以关于3D翻转的动画效果需要我们自己实现,那么我们首先来分析一下Animation 和Transformation。 Animation动画的主要接口,其中主要定义了动画的一些属性比如开始时间,持续时间,是否重复播放等等。而Transformation中则包含一个矩阵和alpha值,矩阵是用来做平移,旋转和缩放动画的,而alpha值是用来做alpha动画的,要实现3D旋转动画我们需要继承自Animation类来实现,我们需要重载getTransformation和applyTransformation,在getTransformation中Animation会根据动画的属性来产生一系列的差值点,然后将这些差值点传给applyTransformation,这个函数将根据这些点来生成不同的Transformation。下面是具体实现: 1.public class Rotate3dAnimation extends Animation { 2.//开始角度 3. private final float mFromDegrees; 4.//结束角度 5. private final float mToDegrees; 6.//中心点 7. private final float mCenterX; 8. private final float mCenterY; 9. private final float mDepthZ; 10.//是否需要扭曲 11. private final boolean mReverse; 12.//摄像头 13. private Camera mCamera; 14. public Rotate3dAnimation(float fromDegrees, float toDegrees, 15. float centerX, float centerY, float depthZ, boolean reverse) { 16. mFromDegrees = fromDegrees; 17. mToDegrees = toDegrees; 18. mCenterX = centerX; 19. mCenterY = centerY; 20. mDepthZ = depthZ; 21. mReverse = reverse; 22. } 23. 24. @Override 25. public void initialize(int width, int height, int parentWidth, int par entHeight) { 26. super.initialize(width, height, parentWidth, parentHeight); 27. mCamera = new Camera(); 28. } 29.//生成Transformation 30. @Override 31. protected void applyTransformation(float interpolatedTime, Transformat ion t) { 32. final float fromDegrees = mFromDegrees; 33.//生成中间角度 34. float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interp olatedTime); 35. 36. final float centerX = mCenterX; 37. final float centerY = mCenterY; 38. final Camera camera = mCamera; 39. 40. final Matrix matrix = t.getMatrix(); 41. 42. camera.save(); 43. if (mReverse) { 44. camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime); 45. } else {Android应用开发基础习题集
如何在android程序中显示图片
Android常用控件
android 自定义控件的过程
android中selector背景选择器(全部属性)
如何用Android用ImageView显示本地和网上的图片说明
android常用控件大全
Android进阶——自定义View之自己绘制彩虹圆环调色板
android消除Preference黑色背景
android 图片剪裁
android自定义布局或View
Android应用开发基础习题
Android 标题栏添加控件及Button控件背景颜色的设置
android图片3d旋转