Java 代码
1.
1、TextSwitcher 的 Demo
2. textswitcher.xml3.
4. 代码
5. <?xml version="1.0" encoding="utf-8"?>
6. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
7. android:orientation="vertical" android:layout_width="fill_parent"
8. android:layout_height="fill_parent">
9.
10. <Button android:id="@+id/btnChange" android:layout_width="wrap_content"
11. android:layout_height="wrap_content" android:text="改变文字" />
12.
13. <!--
14. TextSwitcher - 文字转换器控件(改变文字时增加一些动画效果)
15. -->
16. <TextSwitcher android:id="@+id/textSwitcher"
17. android:layout_width="fill_parent" android:layout_height="wrap_content" />
18.
19. </LinearLayout>
20.
21.
22. _TextSwitcher.java 23.
24. 代码
25. package com.webabcd.view;
26.
27. import java.util.Random;
28.
29. import android.app.Activity;
30. import android.os.Bundle;
31. import android.view.View;
32. import android.view.animation.Animation;
33. import android.view.animation.AnimationUtils;
34. import android.widget.Button;
35. import android.widget.TextSwitcher;
36. import android.widget.TextView;
37. import android.widget.ViewSwitcher;
38.
39. public class _TextSwitcher extends Activity implements ViewSwitcher.ViewFactory { 40.
49. final TextSwitcher switcher = (TextSwitcher) findViewById(R.id.textSwitcher);
50. // 指定转换器的 ViewSwitcher.ViewFactory 51. switcher.setFactory(this);
52.
53. // 设置淡入和淡出的动画效果
54. Animation in = AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
55. Animation out = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
56. switcher.setInAnimation(in);
73. textView.setTextSize(36);
84. <?xml version="1.0" encoding="utf-8"?>
85. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
86. android:orientation="vertical" android:layout_width="fill_parent"
87. android:layout_height="fill_parent">
88.
89. <!--
90. Gallery - 缩略图浏览器控件
91. spacing - 缩略图列表中各个缩略图之间的间距 92. -->
93. <Gallery android:id="@+id/gallery" android:layout_width="fill_parent"
94. android:layout_height="wrap_content" android:spacing="20px" />
95.
102. package com.webabcd.view;
103.
104. import android.app.Activity;
105. import android.content.Context;
106. import android.os.Bundle;
107. import android.view.View;
108. import android.view.ViewGroup;
109. import android.widget.AdapterView;
110. import android.widget.BaseAdapter;
111. import android.widget.Gallery;
112. import android.widget.ImageView;
113. import android.widget.Toast;
114. import android.widget.Gallery.LayoutParams;
115.
116. public class _Gallery extends Activity {
117.
118. @Override
119. protected void onCreate(Bundle savedInstanceState) { 120. // TODO Auto-generated method stub
130. gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 131. @Override
132. public void onItemSelected(AdapterView<?> parent, View v, 133. int position, long id) {
134. Toast.makeText(_Gallery.this, String.valueOf(position), Toast.LENGTH_SHORT).show ();
160.
178. private Integer[] mThumbIds = { R.drawable.icon01, R.drawable.icon02, 179. R.drawable.icon03, R.drawable.icon04, R.drawable.icon05 };
188. <?xml version="1.0" encoding="utf-8"?>
189. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
190. android:orientation="vertical" android:layout_width="fill_parent"
191. android:layout_height="fill_parent">
192.
193. <Gallery android:id="@+id/gallery" android:layout_width="fill_parent"
194. android:layout_height="wrap_content" android:spacing="20px" />
195.
196. <!--
197. ImageSwitcher - 图片转换器控件(改变图片时增加一些动画效果)
198. -->
199. <ImageSwitcher android:id="@+id/imageSwitcher"
200. android:layout_width="fill_parent" android:layout_height="wrap_content" />
201.
202. </LinearLayout>
203.
204.
205. _ImageSwitcher.java 206.
207. 代码
208. package com.webabcd.view;
209.
210. import android.app.Activity;
211. import android.content.Context;
212. import android.os.Bundle;
213. import android.view.View;
214. import android.view.ViewGroup;
215. import android.view.animation.AnimationUtils;
216. import android.widget.AdapterView;
217. import android.widget.BaseAdapter;
218. import android.widget.Gallery;
219. import android.widget.ImageSwitcher;
220. import android.widget.ImageView;
221. import android.widget.ViewSwitcher;
222. import android.widget.Gallery.LayoutParams;
223.
224. // 图片转换器的使用基本同文字转换器
225. // 以下是一个用 ImageSwitcher + Gallery 实现的经典的图片浏览器的 Demo 226. public class _ImageSwitcher extends Activity implements
227. ViewSwitcher.ViewFactory { 228.
229. private ImageSwitcher mSwitcher;
230.
231. @Override
232. protected void onCreate(Bundle savedInstanceState) { 233. // TODO Auto-generated method stub
241. mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, 242. android.R.anim.fade_in));
243. mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, 244. android.R.anim.fade_out));
245.
246. Gallery gallery = (Gallery) findViewById(R.id.gallery);
247. gallery.setAdapter(new ImageAdapter(this));
248. gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
292. } 293.
294. private Integer[] mThumbIds = { R.drawable.icon01, R.drawable.icon02, 295. R.drawable.icon03, R.drawable.icon04, R.drawable.icon05 };
296.
297. private Integer[] mImageIds = { R.drawable.icon01, R.drawable.icon02, 298. R.drawable.icon03, R.drawable.icon04, R.drawable.icon05 };
305. image.setScaleType(ImageView.ScaleType.FIT_CENTER);
306. image.setLayoutParams(new ImageSwitcher.LayoutParams(
307. LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
318. <?xml version="1.0" encoding="utf-8"?>
319.
325. <GridView xmlns:android="http://schemas.android.com/apk/res/android"
326. android:id="@+id/gridView" android:layout_width="fill_parent"
327. android:layout_height="fill_parent" android:padding="10px"
328. android:verticalSpacing="10px" android:horizontalSpacing="10px"
329. android:numColumns="auto_fit" android:columnWidth="60px"
330. android:stretchMode="columnWidth" android:gravity="center">
331. </GridView>
332.
333.
334. _GridView.java 335.
336. 代码
337. package com.webabcd.view;
338.
339. import android.app.Activity;
340. import android.content.Context;
341. import android.os.Bundle;
342. import android.view.View;
343. import android.view.ViewGroup;
344. import android.widget.BaseAdapter;
345. import android.widget.GridView;
346. import android.widget.ImageView;
347.
348. public class _GridView extends Activity { 349.
350. @Override
351. protected void onCreate(Bundle savedInstanceState) { 352. // TODO Auto-generated method stub
380. public long getItemId(int position) { 410. main_list_adapter.xml 411.
412. 代码
413. <?xml version="1.0" encoding="utf-8"?>
414. <!--
415. 自定义列表适配器的 layout 416. -->
417. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
418. android:orientation="horizontal" android:layout_width="fill_parent"
419. android:layout_height="fill_parent">
420.
421. <TextView android:id="@+id/text" android:layout_width="wrap_content"
422. android:layout_height="wrap_content" android:textSize="16sp">
423. </TextView>
424.
425. </LinearLayout>
426.
427.
428. MainListAdapter.java 429.
430. 代码
431. package com.webabcd.view;
432.
433. import java.util.List;
434.
435. import android.content.Context;
436. import android.view.LayoutInflater;
437. import android.view.View;
438. import android.view.ViewGroup;
439. import android.widget.BaseAdapter;
440. import android.widget.TextView;
441.
442. // 继承 BaseAdapter 以实现自定义的列表适配器 443. public class MainListAdapter extends BaseAdapter { 444.
445. private LayoutInflater mInflater;
446. private List<String> mData;
447.
448. public MainListAdapter(Context context, List<String> data) { 449. mInflater = LayoutInflater.from(context);
468. @Override
469. public View getView(int position, View convertView, ViewGroup parent) { 470.
492. package com.webabcd.view;
493.
494. import java.util.ArrayList;
495. import java.util.List;
496.
497. import android.app.ListActivity;
498. import android.content.Intent;
499. import android.os.Bundle;
500. import android.view.View;
501. import android.widget.ListView;
502.
503. // 此处要继承 ListActivity ,用以实现 ListView 的功能 504. public class Main extends ListActivity {
505.
506. private List<String> mData;
507.
508. /** Called when the activity is first created. */
509. @Override
510. public void onCreate(Bundle savedInstanceState) { 511. super.onCreate(savedInstanceState);
512.
521. // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.sim ple_expandable_list_item_1, mData);
522.
555. items.add("TextSwitcher");
569. intent.setClassName(this, "com.webabcd.view._" + mData.get(position));
570. 577. _ExpandableList.java 578.
579. 代码
580. package com.webabcd.view;
581.
582. import android.app.ExpandableListActivity;
583. import android.os.Bundle;
584. import android.view.ContextMenu;
585. import android.view.Gravity;
586. import android.view.MenuItem;
587. import android.view.View;
588. import android.view.ViewGroup;
589. import android.view.ContextMenu.ContextMenuInfo;
590. import android.widget.AbsListView;
591. import android.widget.BaseExpandableListAdapter;
592. import android.widget.ExpandableListAdapter;
593. import android.widget.ExpandableListView;
594. import android.widget.TextView;
595. import android.widget.Toast;
596. import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
597.
598. // ExpandableList - 可展开/收缩列表
599. // 继承 ExpandableListActivity 以实现列表的可展开/收缩的功能 600. public class _ExpandableList extends ExpandableListActivity { 601.
602. private ExpandableListAdapter mAdapter;
603.
604. @Override
605. protected void onCreate(Bundle savedInstanceState) { 606. // TODO Auto-generated method stub
613. registerForContextMenu(this.getExpandableListView());
614. } 615.
616. // 为列表的每一项创建上下文菜单(即长按后呼出的菜单)
617. @Override
618. public void onCreateContextMenu(ContextMenu menu, View v, 619. ContextMenuInfo menuInfo) {
626. public boolean onContextItemSelected(MenuItem item) {
627. ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMen uInfo();
628. String title = ((TextView) info.targetView).getText().toString();
629.
630. int type = ExpandableListView.getPackedPositionType(info.packedPosition);
631. if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
632. int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
633. int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);
634.
635. Toast.makeText(this, title + " - Group Index: " + groupPos + " Child Index: " + childPos, Toast.LENGTH_SHORT).show();
636.
637. return true;
638. } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
639. int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
640. Toast.makeText(this, title + " - Group Index: " + groupPos, Toast.LENGTH_SHORT).sho
648. public class MyExpandableListAdapter extends BaseExpandableListAdapter { 649.
683. @Override
684. public View getChildView(int groupPosition, int childPosition, 685. boolean isLastChild, View convertView, ViewGroup parent) { 686. TextView textView = getGenericView();
687. textView.setText(getChild(groupPosition, childPosition).toString());
688. return textView;
721. public boolean isChildSelectable(int groupPosition, int childPosition) { 722. return true;
723. } 724.
725. // 获取某一项的 View 的逻辑 726. private TextView getGenericView() {
727. AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
728. ViewGroup.LayoutParams.FILL_PARENT, 48);
729. TextView textView = new TextView(_ExpandableList.this);
730. textView.setLayoutParams(lp);
731. textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
732. textView.setPadding(32, 0, 0, 0);
733. return textView;
734. } 735. } 736. }
Android SurfaceView 小解
文章分类:移动开发
注:来自东方尚智沈大海博客
在 android 中开发游戏,一般来说,或想写一个复杂一点的游戏,是必须用到 SurfaceView 来开发的。经过这一阵子对 android 的学习,我找到了自已在 android 中游戏开发的误区,
不要老想着用 Layout 和 view 去实现,不要将某个游戏中的对象做成一个组件来处理。应该 尽量想着在 Canvas(画布)中画出游戏戏中的背景、人物、动画等...SurfaceView 提供直接访问 一个可画图的界面,可以控制在界面顶部的子视图层。SurfaceView 是提供给需要直接画像
素而不是使用窗体部件的应用使用的。Android 图形系统中一个重要的概念和线索是 surface。
View 及其子类(如 TextView, Button)要画在 surface 上。每个 surface 创建一个 Canvas 对象
(但属性时常改变),用来管理 view 在 surface 上的绘图操作,如画点画线。还要注意的是,
使用它的时候,一般都是出现在最顶层的:The view hierarchy will take care of correctly compositing with the Surface any siblings of the SurfaceView that would normally appear on top of it.
使用的 SurfaceView 的时候,一般情况下还要对其进行创建,销毁,改变时的情况进行监视,
这就要用到 SurfaceHolder.Callback.
在用 SurfaceView 进行游戏开发过程中,用到 SurfaceHolder 来处理它的 Canvas 上画的效果 和动画是必不可少的。用于控制表面,大小,像素等。
Abstract interface to someone holding a display surface. Allows you to control the surface size and format,
edit the pixels in the surface, and monitor changes to the surface. This interface is typically available
through the SurfaceView class.
其中特别要注意以下的几个函数:
abstract void addCallback(SurfaceHolder.Callback callback);
// 给 SurfaceView 当前的持有者一个回调对象。
abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象 Canvas,在其上面画图等操作了。
abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的 unlockCanvasAndPost 来
改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画 dirty 外的其它区域的像素,可以提 高速度。
abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。
实例:用线程画一个蓝色的长方形。
Java 代码
1. import android.app.Activity;
2. import android.content.Context;
3. import android.graphics.Canvas;
4. import android.graphics.Color;
5. import android.graphics.Paint;
6. import android.graphics.RectF;
7. import android.os.Bundle;
8. import android.view.SurfaceHolder;
9. import android.view.SurfaceView;
10.
11. public class Test extends Activity { 12.
13. public void onCreate(Bundle savedInstanceState) { 14. super.onCreate(savedInstanceState);
15. setContentView(new MyView(this));
16. } 17.
18. //内部类
19. class MyView extends SurfaceView implements SurfaceHolder.Callback{
20.
30. public void surfaceChanged(SurfaceHolder holder, int format, int width, 31. int height) {
32.
33. } 34.
35.
@Override
36. public void surfaceCreated(SurfaceHolder holder) { 37. new Thread(new MyThread()).start();
38. } 39.
40.
@Override
41. public void surfaceDestroyed(SurfaceHolder holder) {}
42.
43. //内部类的内部类
44. class MyThread implements Runnable{
45.
46.
@Override
47. public void run() {
48. Canvas canvas = holder.lockCanvas(null);//获取画布 49. Paint mPaint = new Paint();
50. mPaint.setColor(Color.BLUE);
51.
52. canvas.drawRect(new RectF(40,60,80,80), mPaint);
53. holder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像 54. }
55.
56. } 57.
58. } 59. }
访问 SurfaceView 的底层图形是通过 SurfaceHolder 接口来实现的,通过 getHolder()方法可以 得 到 这 个 SurfaceHolder 对 象 。 你 应 该 实 现 surfaceCreated(SurfaceHolder) 和 surfaceDestroyed(SurfaceHolder)方法来知道在这个 Surface 在窗口的显示和隐藏过程中是什 么时候创建和销毁的。SurfaceView 可以在多线程中被访问。注意:一个 SurfaceView 只在 SurfaceHolder.Callback.surfaceCreated() 和 SurfaceHolder.Callback.surfaceDestroyed()调用之间 是可用的,其他时间是得不到它的 Canvas 对象的(null)。
我的访问过程:
创建一个 SurfaceView 的子类,实现 SurfaceHolder.Callback 接口。
得到这个 SurfaceView 的 SurfaceHolder 对象 holder。
holder.addCallback(callback),也就是实现 SurfaceHolder.Callback 接口的类对象。
在 SurfaceHolder.Callback.surfaceCreated() 调 用 过 后 holder.lockCanvas() 对 象 就 可 以 得 到 SurfaceView 对象对应的 Canvas 对象 canvas 了。
用 canvas 对象画图。
画图结束后调用 holder.unlockCanvasAndPost()就把图画在窗口中了。
SurfaceView 可以多线程访问,在多线程中画图。
Java 代码
1. import android.content.Context;
2. import android.graphics.Canvas;
3. import android.graphics.Color;
4. import android.graphics.Paint;
5. import android.util.Log;
6. import android.view.SurfaceHolder;
7. import android.view.SurfaceView;
8.
9. public class MySurfaceView extends SurfaceView implements 10. SurfaceHolder.Callback {
16. public TouchScreenAdjusterSurfaceView(Context context,) { 17. super(context);
18.
19. mContext = context;
20.
21. mHolder = TouchScreenAdjusterSurfaceView.this.getHolder();
22. mHolder.addCallback(TouchScreenAdjusterSurfaceView.this);
23.
24. this.setFocusableInTouchMode(true); // to make sure that we can get 25. // touch events and key events,and
31. public void surfaceChanged(SurfaceHolder holder, int format, int width, 32. int height) {
38. public void surfaceCreated(SurfaceHolder holder) { 39. //now you can get the Canvas and draw something here 40. }
41.
42.
@Override
43. public void surfaceDestroyed(SurfaceHolder holder) { 44. // TODO Auto-generated method stub
45.
46. } 47.
48.
49. public void drawMyShape(PointPostion ps) { 50.
51. mCanvas = mHolder.lockCanvas();
52.
53. // draw anything you like 54.
55. mHolder.unlockCanvasAndPost(mCanvas);
56. } 57.
58. }
android 琐碎笔记六
文章分类:移动开发
1.得到屏幕的 screen dimensions
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();int height = display.getHeight();
2. 播放 gif 图片在 android
@Override protected void onDraw(Canvas canvas) { canvas.drawColor(0xFFCCCCCC);
Paint p = new Paint();
p.setAntiAlias(true);
canvas.drawBitmap(mBitmap4, 210, 170, null);
mDrawable.draw(canvas);
long now = android.os.SystemClock.uptimeMillis();
if (mMovieStart == 0) { // first time mMovieStart = now; } if (mMovie != null) {
int dur = mMovie.duration();
if (dur == 0) {
dur = 1000; }
int relTime = (int)((now - mMovieStart) % dur);
mMovie.setTime(relTime);
mMovie.draw(canvas, getWidth() - mMovie.width(), getHeight() - mMovie.height());
invalidate();
} }
@Override
protected void onDraw(Canvas canvas) { if(movie != null) {
long now = android.os.SystemClock.uptimeMillis();
int dur = Math.max(movie.duration(), 1);
// is it really animated?
int pos = (int)(now % dur);
movie.setTime(pos);
movie.draw(canvas, x, y);
invalidate();
}}
4. 打开 sd 卡中的 sqllite
File dbfile = new File("/sdcard/mydb.sqlite" );
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
5.得到手机的 IMEI
((TelephonyManager) getSystemService=(Context.TELEPHONY_SERVICE)).getDeviceId();
6. 不让程序 生成一个 appliation 去掉
<category android:name="android.intent.category.LAUNCHER" />
当然你的让你的程序 被引导启动
7.使用 appliation 的 id 可以获得不同 appliation 的数据:
android:sharedUserId="string" 在主 xml 中添加上面一句话,然后签名也要一样 两个 app 的 id 也要设置成一样 如都是 string 那么这两个程序就可以相互访问彼此的数据,也可以在同 一个 process 中了
8.判断相机设备存在不
private android.hardware.Camera mCameraDevice;
try {
mCameraDevice = android.hardware.Camera.open();}
catch (RuntimeException e) { Log.e(TAG, "fail to connect Camera", e);
9 使 listView 透明
android:background="#00000000"
android:cacheColorHint="#00000000"
或者
android:background="@android:color/transparent"
•The background android screen image should be visible.
屏幕的背景图像可以看见
manifest file 添加 attribute 到 activity.
android:theme="@android:style/Theme.Dialog"
Android 通过 selector 改变界面状态
文章分类:移动开发