Android ApiDemo 笔记(二)Graphics和View

Android ApiDemo 笔记(二)Graphics和View

http://blog.csdn.net/wufenglong/article/details/5605713

package com.example.android.apis.graphics;

23.TextAlign:

1

设置Path路径,贝赛尔曲线

1: //设置Path路径
2: private static void makePath(Path p) {
3: p.moveTo(10, 0);
4: p.cubicTo(100, -50, 200, 50, 300, 0);//贝赛尔曲线
5: }

//mPos存的是字符串中每个字符的位置坐标

1: private float[] buildTextPositions(String text, float y, Paint paint) {
2: float[] widths = new float[text.length()];
3: // initially get the widths for each char
4: int n = paint.getTextWidths(text, widths);
5: // now popuplate the array, interleaving spaces for the Y values X值为字符的宽
6: float[] pos = new float[n * 2];
7: float accumulatedX = 0;
8: for (int i = 0; i < n; i++) {
9: pos[i * 2 + 0] = accumulatedX;
10: pos[i * 2 + 1] = y;
11: accumulatedX += widths[i];
12: }
13: return pos;
14: }

onDraw()方法中:

image

1: p.setColor(0x80FF0000);
2: canvas.drawLine(x, y, x, y + DY * 3, p);//(x,y)为基准线
3: p.setColor(Color.BLACK);
4:  
5: canvas.translate(0, DY);
6: p.setTextAlign(Paint.Align.LEFT);
7: canvas.drawText(TEXT_L, x, y, p);//以(x,y)点Paint.Align.LEFT,画

image

1: p.setColor(0xBB00FF00);
2: for (int i = 0; i < pos.length / 2; i++) {
3: canvas.drawLine(pos[i * 2 + 0], pos[i * 2 + 1] - DY, pos[i * 2 + 0],
4: pos[i * 2 + 1] + DY * 2, p);
5: }
6: p.setColor(Color.BLACK);
7:  
8: p.setTextAlign(Paint.Align.LEFT);
9: canvas.drawPosText(POSTEXT, pos, p);

image

1: canvas.drawPath(mPathmPathPaint);
2: p.setTextAlign(Paint.Align.LEFT);
3: canvas.drawTextOnPath(TEXTONPATHmPath, 0, 0, p);
4:
5: canvas.translate(0, DY * 1.5f);
6: canvas.drawPath(mPathmPathPaint);
7: p.setTextAlign(Paint.Align.CENTER);
8: canvas.drawTextOnPath(TEXTONPATHmPath, 0, 0, p);
9:
10: canvas.translate(0, DY * 1.5f);
11: canvas.drawPath(mPathmPathPaint);
12: p.setTextAlign(Paint.Align.RIGHT);
13: canvas.drawTextOnPath(TEXTONPATHmPath, 0, 0, p);

24.Typefaces:

1

获得assets/fonts下的字体

1: mFace = Typeface.createFromAsset(getContext().getAssets(),
2: "fonts/samplefont.ttf");

onDraw()方法

1: @Override
2: protected void onDraw(Canvas canvas) {
3: canvas.drawColor(Color.WHITE);
4:  
5: mPaint.setTypeface(null);
6: canvas.drawText("Default", 10, 100, mPaint);
7: mPaint.setTypeface(mFace);
8: canvas.drawText("Custom", 10, 200, mPaint);
9: }

25.UnicodeChart:(没看)

1

26.Vertices:(没看) 触摸一下,图片走形

image

27.Xfermodes:

1

圆形画法:

1: static Bitmap makeDst(int w, int h) {
2: Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
3: Canvas c = new Canvas(bm);
4: Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
5: p.setColor(0xFFFFCC44);
6: c.drawOval(new RectF(0, 0, w * 3 / 4, h * 3 / 4), p);
7: return bm;
8: }

正方形的画法:

1: static Bitmap makeSrc(int w, int h) {
2: Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
3: Canvas c = new Canvas(bm);
4: Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
5:  
6: p.setColor(0xFF66AAFF);
7: c.drawRect(w / 3, h / 3, w * 19 / 20, h * 19 / 20, p);
8: return bm;
9: }

背景马塞克画法:

1: Bitmap bm = Bitmap.createBitmap(new int[] { 0xFFFFFFFF, 0xFFCCCCCC,
2: 0xFFCCCCCC, 0xFFFFFFFF }, 2, 2, Bitmap.Config.RGB_565);
3: mBG new BitmapShader(bm, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
4: Matrix m = new Matrix();
5: m.setScale(6, 6);// 放大6倍
6: mBG.setLocalMatrix(m);

Xfermode数组:

1: private static final Xfermode[] sModes = {
2: new PorterDuffXfermode(PorterDuff.Mode.CLEAR),
3: new PorterDuffXfermode(PorterDuff.Mode.SRC),
4: new PorterDuffXfermode(PorterDuff.Mode.DST),
5: new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),
6: new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
7: new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
8: new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
9: new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),
10: new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),
11: new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),
12: new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),
13: new PorterDuffXfermode(PorterDuff.Mode.XOR),
14: new PorterDuffXfermode(PorterDuff.Mode.DARKEN),
15: new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),
16: new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),
17: new PorterDuffXfermode(PorterDuff.Mode.SCREEN) };

onDraw()方法:

1: @Override
2: protected void onDraw(Canvas canvas) {
3: canvas.drawColor(Color.WHITE);
4:  
5: Paint labelP = new Paint(Paint.ANTI_ALIAS_FLAG);
6: labelP.setTextAlign(Paint.Align.CENTER);
7:  
8: Paint paint = new Paint();
9: paint.setFilterBitmap(false);
10:  
11: canvas.translate(15, 35);
12:  
13: int x = 0;
14: int y = 0;
15: for (int i = 0; i < sModes.length; i++) {
16: // draw the border
17: paint.setStyle(Paint.Style.STROKE);
18: paint.setShader(null);// Pass null to clear any previous shader
19: canvas.drawRect(x - 0.5f, y - 0.5f, x + + 0.5f, y + + 0.5f, paint);
20:  
21: // draw the checker-board pattern
22: paint.setStyle(Paint.Style.FILL);
23: paint.setShader(mBG);
24: canvas.drawRect(x, y, x + W, y + H, paint);
25:  
26: // draw the src/dst example into our offscreen bitmap
27: int sc = canvas.saveLayer(x, y, x + W, y + Hnull,
28: Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG
29: | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
30: | Canvas.FULL_COLOR_LAYER_SAVE_FLAG
31: | Canvas.CLIP_TO_LAYER_SAVE_FLAG);
32: // canvas.save();
33: canvas.translate(x, y);
34: canvas.drawBitmap(mDstB, 0, 0, paint);
35: paint.setXfermode(sModes[i]);
36: canvas.drawBitmap(mSrcB, 0, 0, paint);
37: paint.setXfermode(null);// Pass null to clear any previous xfermode
38: canvas.restoreToCount(sc);
39: // canvas.restore();
40:
41: // draw the label
42: canvas.drawText(sLabels[i], x + / 2, y - labelP.getTextSize() / 2,
43: labelP);
44:  
45: x += + 10;
46:  
47: // wrap around when we've drawn enough for one row
48: if ((i % ROW_MAX) == ROW_MAX - 1) {
49: x = 0;
50: y += + 30;
51: }
52: }
53: }

注意:上面代码一定要有这两句,改成// canvas.save();都不成,会出现2

1: int sc = canvas.saveLayer(x, y, x + W, y + Hnull,
2: Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG
3: | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
4: | Canvas.FULL_COLOR_LAYER_SAVE_FLAG
5: | Canvas.CLIP_TO_LAYER_SAVE_FLAG);
6: // canvas.save();
1: canvas.restoreToCount(sc);
2: // canvas.restore();

三.package com.example.android.apis.view;

1.views/Animation/Shake,点Login按钮后EditView会有抖动

image

代码如下:

1: public class Animation1 extends Activity implements View.OnClickListener {//设置单击监听,当然也可以直接在setOnClickListener里new
2:
3: @Override
4: public void onCreate(Bundle savedInstanceState) {
5: super.onCreate(savedInstanceState);
6: setContentView(R.layout.animation_1);
7:  
8: View loginButton = findViewById(R.id.login);
9: loginButton.setOnClickListener(this);
10: }
11:  
12: public void onClick(View v) {//当loginButton被点击时运行
13: Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);//Loads an Animation object from a resource
14: findViewById(R.id.pw).startAnimation(shake);//Start the specified animation now.
15: }
16: }

动画文件在res/anim下

shake.xml为

1: <?xml version="1.0" encoding="utf-8"?>
2: <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0"android:toXDelta="10" android:duration="1000" android:interpolator="@anim/cycle_7" />

此为translate 类型动画,从“0”移动到“10”,

注意:android:interpolator="@anim/cycle_7"这句为“插入器(窜改者)”

cycle_7.xml如下:

1: <?xml version="1.0" encoding="utf-8"?>
2: <cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:cycles="7" />

 cycle为循环,表示shake的动画在1秒内被循环7次

2.Animation2:最上面是一个ViewFlipper用于4个TextView顺序翻转,最下面是一个Spinner,用于选择翻转方式(4种)

1

先学习下布局:(1个ViewFlipper 下面有4个TextView)

1: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: android:orientation="vertical"
3: android:padding="10dip"
4: android:layout_width="fill_parent"
5: android:layout_height="wrap_content">
6:
7: <ViewFlipper android:id="@+id/flipper"
8: android:layout_width="fill_parent"
9: android:layout_height="wrap_content"
10: android:flipInterval="2000"
11: android:layout_marginBottom="20dip" >
12: <TextView
13: android:layout_width="fill_parent"
14: android:layout_height="wrap_content"
15: android:gravity="center_horizontal"
16: android:textSize="26sp"
17: android:text="@string/animation_2_text_1"/>
18: <TextView
19: android:layout_width="fill_parent"
20: android:layout_height="wrap_content"
21: android:gravity="center_horizontal"
22: android:textSize="26sp"
23: android:text="@string/animation_2_text_2"/>
24: <TextView
25: android:layout_width="fill_parent"
26: android:layout_height="wrap_content"
27: android:gravity="center_horizontal"
28: android:textSize="26sp"
29: android:text="@string/animation_2_text_3"/>
30: <TextView
31: android:layout_width="fill_parent"
32: android:layout_height="wrap_content"
33: android:gravity="center_horizontal"
34: android:textSize="26sp"
35: android:text="@string/animation_2_text_4"/>
36: </ViewFlipper>
37:
38: <TextView
39: android:layout_width="fill_parent"
40: android:layout_height="wrap_content"
41: android:layout_marginBottom="5dip"
42: android:text="@string/animation_2_instructions"
43: />
44:
45: <Spinner android:id="@+id/spinner"
46: android:layout_width="fill_parent"
47: android:layout_height="wrap_content"
48: />

Spinner被选择时,setInAnimation,setOutAnimation为Viewanimator的方法用于设置TextView的入场,出场动画

1: public void onItemSelected(AdapterView parent, View v, int position, long id) {
2: switch (position) {
3:  
4: case 0:
5: mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
6: R.anim.push_up_in));
7: mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
8: R.anim.push_up_out));
9: break;
10: case 1:
11: mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
12: R.anim.push_left_in));
13: mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
14: R.anim.push_left_out));
15: break;
16: case 2:
17: mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
18: android.R.anim.fade_in));
19: mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
20: android.R.anim.fade_out));
21: break;
22: default:
23: mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
24: R.anim.hyperspace_in));
25: mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
26: R.anim.hyperspace_out));
27: break;
28: }
29: }

res/anim/push_up_in.xml

1: <?xml version="1.0" encoding="utf-8"?>
2: <set xmlns:android="http://schemas.android.com/apk/res/android">
3: <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="300"/>
4: <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
5: </set>
6:

res/anim/push_up_out.xml

1: <?xml version="1.0" encoding="utf-8"?>
2: <set xmlns:android="http://schemas.android.com/apk/res/android">
3: <translate android:fromYDelta="0" android:toYDelta="-100%p" android:duration="300"/>
4: <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" />
5: </set>
6:

res/anim/push_left_in.xml

1: <?xml version="1.0" encoding="utf-8"?>
2: <set xmlns:android="http://schemas.android.com/apk/res/android">
3: <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="300"/>
4: <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
5: </set>
6:

res/anim/ hyperspace_in.xml

1: <?xml version="1.0" encoding="utf-8"?>
2: <alpha xmlns:android="http://schemas.android.com/apk/res/android"
3: android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300"
4: android:startOffset="1200" />
5:

res/anim/ hyperspace_out.xml

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <set xmlns:android="http://schemas.android.com/apk/res/android"
4: android:shareInterpolator="false">
5:
6: <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator"
7: android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0"
8: android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%"
9: android:fillAfter="false" android:duration="700" />
10:
11:
12: <set android:interpolator="@android:anim/accelerate_interpolator"
13: android:startOffset="700">
14:
15: <scale android:fromXScale="1.4" android:toXScale="0.0"
16: android:fromYScale="0.6" android:toYScale="0.0" android:pivotX="50%"
17: android:pivotY="50%" android:duration="400" />
18:
19: <rotate android:fromDegrees="0" android:toDegrees="-45"
20: android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%"
21: android:duration="400" />
22: </set>
23:
24: </set>

以上几个动画可以直接用在ImageView上

3.Animation3:

主要是Interpolator的用法。public void setInterpolator (Interpolator i)Sets the acceleration curve for this animation. Defaults to a linear interpolation(设置动画的加速度效果)

1

首先在第一个TextView中加入动画效果: image
1: final View target = findViewById(R.id.target);//TextView
2: final View targetParent = (View) target.getParent();//TextView的父view
3:
4: Animation a = new TranslateAnimation(0.0f, targetParent.getWidth()//设置位移动画
5: - target.getWidth() - targetParent.getPaddingLeft()
6: - targetParent.getPaddingRight(), 0.0f, 0.0f);
7: a.setDuration(1000);//持续1秒
8: a.setStartOffset(300);
9: a.setRepeatMode(Animation.RESTART);//重复
10: a.setRepeatCount(Animation.INFINITE);//无限次

android自带的7种Interpolator 效果

1: switch (position) {
2: case 0:
3: a.setInterpolator(AnimationUtils.loadInterpolator(this,
4: android.R.anim.accelerate_interpolator));
5: break;
6: case 1:
7: a.setInterpolator(AnimationUtils.loadInterpolator(this,
8: android.R.anim.decelerate_interpolator));
9: break;
10: case 2:
11: a.setInterpolator(AnimationUtils.loadInterpolator(this,
12: android.R.anim.accelerate_decelerate_interpolator));
13: break;
14: case 3:
15: a.setInterpolator(AnimationUtils.loadInterpolator(this,
16: android.R.anim.anticipate_interpolator));
17: break;
18: case 4:
19: a.setInterpolator(AnimationUtils.loadInterpolator(this,
20: android.R.anim.overshoot_interpolator));
21: break;
22: case 5:
23: a.setInterpolator(AnimationUtils.loadInterpolator(this,
24: android.R.anim.anticipate_overshoot_interpolator));
25: break;
26: case 6:
27: a.setInterpolator(AnimationUtils.loadInterpolator(this,
28: android.R.anim.bounce_interpolator));
29: break;
30: }
31:  
32: target.startAnimation(a);

 4. Transition3d:package com.example.android.apis.animation;(没看全)

图片切换3D效果的动画

1

layout为一个FrameLayout里放入一个ListView和一个ImageView ,动画是这两个View的切换效果

5.AutoComplete1

自动完成TextView,主要实现自动提示国家的英文

1

image 这块的layout布局

1: <LinearLayout
2: android:orientation="horizontal"
3: android:layout_width="fill_parent"
4: android:layout_height="wrap_content">
5:
6: <TextView
7: android:layout_width="wrap_content"
8: android:layout_height="wrap_content"
9: android:text="@string/autocomplete_1_country" />
10:
11: <AutoCompleteTextView android:id="@+id/edit"
12: android:layout_width="fill_parent"
13: android:layout_height="wrap_content"/>
14:
15: </LinearLayout>

在AutoCompeteTextView里设置个Adapter

1: ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
2: android.R.layout.simple_dropdown_item_1lineCOUNTRIES);
3: AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.edit);
4: textView.setAdapter(adapter);

第二行的COUNTRIES为一个数组:

1: static final String[] COUNTRIES new String[] { "Afghanistan""Albania",
2: "Algeria""American Samoa""Andorra""Angola""Anguilla",
3: "Antarctica""Antigua and Barbuda""Argentina""Armenia""Aruba",
4: "Australia""Austria""Azerbaijan""Bahrain""Bangladesh",
5: "Barbados""Belarus""Belgium""Belize""Benin""Bermuda""Bhutan",
6: "Bolivia""Bosnia and Herzegovina""Botswana""Bouvet Island",
7: "Brazil""British Indian Ocean Territory""British Virgin Islands",
8: "Brunei""Bulgaria""Burkina Faso""Burundi""Cote d'Ivoire",
9: "Cambodia""Cameroon""Canada""Cape Verde""Cayman Islands",
10: "Central African Republic""Chad""Chile""China""Christmas Island",
11: "Cocos (Keeling) Islands""Colombia""Comoros""Congo",
12: "Cook Islands""Costa Rica""Croatia""Cuba""Cyprus",
13: "Czech Republic""Democratic Republic of the Congo""Denmark",
14: "Djibouti""Dominica""Dominican Republic""East Timor""Ecuador",
15: "Egypt""El Salvador""Equatorial Guinea""Eritrea""Estonia",
16: "Ethiopia""Faeroe Islands""Falkland Islands""Fiji""Finland",
17: "Former Yugoslav Republic of Macedonia""France""French Guiana",
18: "French Polynesia""French Southern Territories""Gabon""Georgia",
19: "Germany""Ghana""Gibraltar""Greece""Greenland""Grenada",
20: "Guadeloupe""Guam""Guatemala""Guinea""Guinea-Bissau""Guyana",
21: "Haiti""Heard Island and McDonald Islands""Honduras""Hong Kong",
22: "Hungary""Iceland""India""Indonesia""Iran""Iraq""Ireland",
23: "Israel""Italy""Jamaica""Japan""Jordan""Kazakhstan""Kenya",
24: "Kiribati""Kuwait""Kyrgyzstan""Laos""Latvia""Lebanon",
25: "Lesotho""Liberia""Libya""Liechtenstein""Lithuania",
26: "Luxembourg""Macau""Madagascar""Malawi""Malaysia""Maldives",
27: "Mali""Malta""Marshall Islands""Martinique""Mauritania",
28: "Mauritius""Mayotte""Mexico""Micronesia""Moldova""Monaco",
29: "Mongolia""Montserrat""Morocco""Mozambique""Myanmar""Namibia",
30: "Nauru""Nepal""Netherlands""Netherlands Antilles""New Caledonia",
31: "New Zealand""Nicaragua""Niger""Nigeria""Niue""Norfolk Island",
32: "North Korea""Northern Marianas""Norway""Oman""Pakistan",
33: "Palau""Panama""Papua New Guinea""Paraguay""Peru""Philippines",
34: "Pitcairn Islands""Poland""Portugal""Puerto Rico""Qatar",
35: "Reunion""Romania""Russia""Rwanda""Sqo Tome and Principe",
36: "Saint Helena""Saint Kitts and Nevis""Saint Lucia",
37: "Saint Pierre and Miquelon""Saint Vincent and the Grenadines""Samoa",
38: "San Marino""Saudi Arabia""Senegal""Seychelles""Sierra Leone",
39: "Singapore""Slovakia""Slovenia""Solomon Islands""Somalia",
40: "South Africa""South Georgia and the South Sandwich Islands",
41: "South Korea""Spain""Sri Lanka""Sudan""Suriname",
42: "Svalbard and Jan Mayen""Swaziland""Sweden""Switzerland""Syria",
43: "Taiwan""Tajikistan""Tanzania""Thailand""The Bahamas",
44: "The Gambia""Togo""Tokelau""Tonga""Trinidad and Tobago",
45: "Tunisia""Turkey""Turkmenistan""Turks and Caicos Islands",
46: "Tuvalu""Virgin Islands""Uganda""Ukraine""United Arab Emirates",
47: "United Kingdom""United States",
48: "United States Minor Outlying Islands""Uruguay""Uzbekistan",
49: "Vanuatu""Vatican City""Venezuela""Vietnam""Wallis and Futuna",
50: "Western Sahara""Yemen""Yugoslavia""Zambia""Zimbabwe" };

6.AutoComplete2

1

和AutoComplete1只是布局不一样,注意第5行的android:gravity=”bottom”

1: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: android:orientation="vertical"
3: android:layout_width="fill_parent"
4: android:layout_height="fill_parent"
5: android:gravity="bottom">
6:
7: <Button
8: android:layout_width="wrap_content"
9: android:layout_height="wrap_content"
10: android:text="@string/autocomplete_2_focus" />
11:
12: <LinearLayout

7.AutoComplete6(没看出和上面的有什么不同的功能)

1

布局要注意:为MutiAutoCompleteTextView

1: <TextView
2: android:layout_width="wrap_content"
3: android:layout_height="wrap_content"
4: android:text="@string/autocomplete_7_country" />
5:
6: <MultiAutoCompleteTextView android:id="@+id/edit"
7: android:layout_width="fill_parent"
8: android:layout_height="wrap_content"/>

设置Adapter

1: ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
2: android.R.layout.simple_dropdown_item_1lineCOUNTRIES);
3: MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.edit);
4: textView.setAdapter(adapter);
5: textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());

8.Baseline1:

1

直接加载的layout布局:

1: <TextView
2: android:layout_width="wrap_content"
3: android:layout_height="wrap_content"
4: android:layout_marginRight="30dip"
5: android:text="@string/baseline_1_label" />
6:
7: <Button
8: android:layout_width="wrap_content"
9: android:layout_height="wrap_content"
10: android:layout_marginRight="30dip"
11: android:text="@string/baseline_1_button" />

第4行和第10行的

android:layout_marginRight="30dip"

为此TextView右边有30像素的空白

9.Baseline3

1

布局:

注意:第11行的android:layout_gravity="center_vertical"表示在父View的中心

1: <LinearLayout
2: android:orientation="horizontal"
3: android:layout_width="fill_parent"
4: android:layout_weight="1.0"
5: android:layout_height="0dip">
6:
7: <TextView
8: android:layout_width="wrap_content"
9: android:layout_height="wrap_content"
10: android:layout_marginRight="3dip"
11: android:layout_gravity="center_vertical"
12: android:text="@string/baseline_3_label" />
13:
14: <Button
15: android:layout_width="wrap_content"
16: android:layout_height="wrap_content"
17: android:layout_marginRight="3dip"
18: android:layout_gravity="center_vertical"
19: android:text="@string/baseline_3_button" />
20:
21: <TextView
22: android:layout_width="wrap_content"
23: android:layout_height="wrap_content"
24: android:layout_gravity="center_vertical"
25: android:textSize="20sp"
26: android:text="@string/baseline_3_bigger" />
27:
28: </LinearLayout>

10.Baseline4

1

此布局就是父View的Layout为android:orientation="horizontal"水平布局,然后子view再应用android:layout_gravity="center_vertical"和android:gravity="bottom"

11.Baseline6(没明白效果)

1

布局:

1: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: android:layout_width="fill_parent"
3: android:layout_height="fill_parent">
4:
5: <EditText android:id="@+id/anchor"
6: android:layout_width="fill_parent"
7: android:layout_height="fill_parent"
8: android:textSize="20sp"
9: android:text="@string/baseline_6_multi_line" />
10:
11: <TextView
12: android:layout_width="wrap_content"
13: android:layout_height="wrap_content"
14: android:layout_alignBaseline="@id/anchor"
15: android:layout_alignRight="@id/anchor"
16: android:text="@string/baseline_6_baseline" />
17:
18: </RelativeLayout>

12.Baseline7

1

布局:

注意:TextViewandroid:id="@+id/anchor"android:layout_alignParentTop="true"android:layout_alignParentLeft="true"设置它为父VIEW的左上角

第16行android:layout_alignBaseline="@id/anchor",设置此View在anchor的一条线上

1: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: android:layout_width="fill_parent"
3: android:layout_height="fill_parent">
4:
5: <TextView android:id="@+id/anchor"
6: android:layout_width="wrap_content"
7: android:layout_height="wrap_content"
8: android:layout_alignParentTop="true"
9: android:layout_alignParentLeft="true"
10: android:textStyle="bold"
11: android:text="@string/baseline_7_fat" />
12:
13: <TextView
14: android:layout_width="wrap_content"
15: android:layout_alignParentRight="true"
16: android:layout_alignBaseline="@id/anchor"
17: android:layout_height="wrap_content"
18: android:text="@string/baseline_7_lean" />
19:
20: </RelativeLayout>

13.Buttons1:

1

主要是布局:

第二个按钮为小按钮,第14行style="?android:attr/buttonStyleSmall" 

第三个按钮为开关按钮,ToggleButton

1: <LinearLayout
2: android:layout_width="wrap_content"
3: android:layout_height="wrap_content"
4: android:orientation="vertical">
5:
6: <!-- Regular sized buttons -->
7: <Button android:id="@+id/button_normal"
8: android:text="@string/buttons_1_normal"
9: android:layout_width="wrap_content"
10: android:layout_height="wrap_content" />
11:
12: <!-- Small buttons -->
13: <Button android:id="@+id/button_small"
14: style="?android:attr/buttonStyleSmall"
15: android:text="@string/buttons_1_small"
16: android:layout_width="wrap_content"
17: android:layout_height="wrap_content" />
18:
19: <ToggleButton android:id="@+id/button_toggle"
20: android:text="@string/buttons_1_toggle"
21: android:layout_width="wrap_content"
22: android:layout_height="wrap_content" />
23:
24: </LinearLayout>

14.ChronometerDemo 计时器

1

布局:

1: <Chronometer android:id="@+id/chronometer"
2: android:format="@string/chronometer_initial_format"
3: android:layout_width="wrap_content" android:layout_height="wrap_content"
4: android:layout_weight="0" android:paddingBottom="30dip"
5: android:paddingTop="30dip" />
6:
7: <Button android:id="@+id/start" android:layout_width="wrap_content"
8: android:layout_height="wrap_content" android:text="@string/chronometer_start">
9: <requestFocus />
10: </Button>

对Chronometer控件的操作:

设置监听:

1: button = (Button) findViewById(R.id.start);
2: button.setOnClickListener(mStartListener);
3:
4: button = (Button) findViewById(R.id.stop);
5: button.setOnClickListener(mStopListener);
6:
7: button = (Button) findViewById(R.id.reset);
8: button.setOnClickListener(mResetListener);
9:
10: button = (Button) findViewById(R.id.set_format);
11: button.setOnClickListener(mSetFormatListener);
12:
13: button = (Button) findViewById(R.id.clear_format);
14: button.setOnClickListener(mClearFormatListener);

监听事件:

1: View.OnClickListener mStartListener new OnClickListener() {
2: public void onClick(View v) {
3: mChronometer.start();
4: }
5: };
6:
7: View.OnClickListener mStopListener new OnClickListener() {
8: public void onClick(View v) {
9: mChronometer.stop();
10: }
11: };
12:
13: View.OnClickListener mResetListener new OnClickListener() {
14: public void onClick(View v) {
15: mChronometer.setBase(SystemClock.elapsedRealtime());
16: }
17: };
18:
19: View.OnClickListener mSetFormatListener new OnClickListener() {
20: public void onClick(View v) {
21: mChronometer.setFormat("Formatted time (%s)");
22: }
23: };
24:
25: View.OnClickListener mClearFormatListener new OnClickListener() {
26: public void onClick(View v) {
27: mChronometer.setFormat(null);
28: }
29: };

 15.Controls1:

1

image 此图的布局:

1: <CheckBox android:id="@+id/star"
2: style="?android:attr/starStyle"
3: android:layout_width="wrap_content"
4: android:layout_height="wrap_content"
5: android:text="@string/controls_1_star" />

注意这几个布局:image

1: <TextView
2: android:layout_width="fill_parent"
3: android:layout_height="wrap_content"
4: android:layout_marginTop="5dip"
5: android:text="@string/textColorPrimary"
6: android:textAppearance="?android:attr/textAppearanceLarge"
7: android:focusable="true"
8: />
9:
10: <TextView
11: android:layout_width="fill_parent"
12: android:layout_height="wrap_content"
13: android:layout_marginTop="5dip"
14: android:text="@string/textColorSecondary"
15: android:textAppearance="?android:attr/textAppearanceLarge"
16: android:textColor="?android:attr/textColorSecondary"
17: android:focusable="true"
18: />
19:
20: <TextView
21: android:layout_width="fill_parent"
22: android:layout_height="wrap_content"
23: android:layout_marginTop="5dip"
24: android:text="@string/textColorTertiary"
25: android:textAppearance="?android:attr/textAppearanceLarge"
26: android:textColor="?android:attr/textColorTertiary"
27: android:focusable="true"
28: />
29:
30: <TextView
31: style="?android:attr/listSeparatorTextViewStyle"
32: android:text="@string/listSeparatorTextViewStyle"
33: android:layout_marginTop="5dip"
34: />

 16.CustomView1:

1

此布局用了自定义的View(com.example.android.apis.view.LabelView)

1: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: xmlns:app="http://schemas.android.com/apk/res/com.example.android.apis"
3: android:orientation="vertical"
4: android:layout_width="fill_parent"
5: android:layout_height="wrap_content">
6:
7: <com.example.android.apis.view.LabelView
8: android:background="@drawable/red"
9: android:layout_width="fill_parent"
10: android:layout_height="wrap_content"
11: app:text="Red"/>
12:
13: <com.example.android.apis.view.LabelView
14: android:background="@drawable/blue"
15: android:layout_width="fill_parent"
16: android:layout_height="wrap_content"
17: app:text="Blue" app:textSize="20dp"/>
18:
19: <com.example.android.apis.view.LabelView
20: android:background="@drawable/green"
21: android:layout_width="fill_parent"
22: android:layout_height="wrap_content"
23: app:text="Green" app:textColor="#ffffffff" />
24:
25: </LinearLayout>

17.DateWidgets1 时间控件

1

18.ExpandableList1 (没看)

用到android.widget.ExpandableListAdapter;

1

19.ExpandableList3(没看)

1

20.Focus1

1

1: WebView webView = (WebView) findViewById(R.id.rssWebView);
2: webView
3: .loadData(
4: "<html><body>Can I focus?<br /><a href=/"#/">No I cannot!</a>.</body></html>",
5: "text/html""utf-8");

21.Gallery1

长按图片会弹出一个菜单,菜单选项被选后,作调用Toast

1

1: public class Gallery1 extends Activity {
2:  
3: @Override
4: public void onCreate(Bundle savedInstanceState) {
5: super.onCreate(savedInstanceState);
6: setContentView(R.layout.gallery_1);
7:  
8: // Reference the Gallery view
9: Gallery g = (Gallery) findViewById(R.id.gallery);
10: // Set the adapter to our custom adapter (below)
11: g.setAdapter(new ImageAdapter(this));
12:  
13: // Set a item click listener, and just Toast the clicked position
14: g.setOnItemClickListener(new OnItemClickListener() {
15: public void onItemClick(AdapterView parent, View v, int position, long id) {
16: Toast.makeText(Gallery1.this"" + position, Toast.LENGTH_SHORT).show();
17: }
18: });
19:  
20: // We also want to show context menu for longpressed items in the gallery
21: registerForContextMenu(g);
22: }
23:  
24: @Override
25: public void onCreateContextMenu(ContextMenu menu, View v,
26: ContextMenuInfo menuInfo) {
27: menu.add(R.string.gallery_2_text);
28: }
29:  
30: @Override
31: public boolean onContextItemSelected(MenuItem item) {
32: AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
33: Toast.makeText(this"Longpress: " + info.position, Toast.LENGTH_SHORT)
34: .show();
35: return true;
36: }
37:  
38: public class ImageAdapter extends BaseAdapter {
39: int mGalleryItemBackground;
40:  
41: public ImageAdapter(Context c) {
42: mContext = c;
43: // See res/values/attrs.xml for the <declare-styleable> that defines
44: // Gallery1.
45: TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
46: mGalleryItemBackground = a.getResourceId(
47: R.styleable.Gallery1_android_galleryItemBackground, 0);
48: a.recycle();
49: }
50:  
51: public int getCount() {
52: return mImageIds.length;
53: }
54:  
55: public Object getItem(int position) {
56: return position;
57: }
58:  
59: public long getItemId(int position) {
60: return position;
61: }
62:  
63: public View getView(int position, View convertView, ViewGroup parent) {
64: ImageView i = new ImageView(mContext);
65:  
66: i.setImageResource(mImageIds[position]);
67: i.setScaleType(ImageView.ScaleType.FIT_XY);
68: i.setLayoutParams(new Gallery.LayoutParams(136, 88));
69:  
70: // The preferred Gallery item background
71: i.setBackgroundResource(mGalleryItemBackground);
72:  
73: return i;
74: }
75:  
76: private Context mContext;
77:  
78: private Integer[] mImageIds = { R.drawable.gallery_photo_1,
79: R.drawable.gallery_photo_2, R.drawable.gallery_photo_3,
80: R.drawable.gallery_photo_4, R.drawable.gallery_photo_5,
81: R.drawable.gallery_photo_6, R.drawable.gallery_photo_7,
82: R.drawable.gallery_photo_8 };
83: }
84:  
85: }

22.Grid1

1

布局:

1: <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/myGrid"
2: android:layout_width="fill_parent"
3: android:layout_height="fill_parent"
4: android:padding="10dp"
5: android:verticalSpacing="10dp"
6:
7: android:horizontalSpacing="10dp"
8: android:numColumns="auto_fit"
9: android:columnWidth="60dp"
10: android:CMode="columnWidth"
11:
12: android:gravity="center"
13: />

 23.Grid2

1

1: setContentView(R.layout.grid_2);
2:  
3: GridView g = (GridView) findViewById(R.id.myGrid);
4: g.setAdapter(new ImageAdapter(this));

ImageAdapter的getView方法:

1: public View getView(int position, View convertView, ViewGroup parent) {
2: ImageView imageView;
3: if (convertView == null) {
4: imageView = new ImageView(mContext);
5: imageView.setLayoutParams(new GridView.LayoutParams(45, 45));
6: imageView.setAdjustViewBounds(false);
7: imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
8: imageView.setPadding(8, 8, 8, 8);
9: else {
10: imageView = (ImageView) convertView;
11: }
12:  
13: imageView.setImageResource(mThumbIds[position]);
14:  
15: return imageView;
16: }

24.ImageSwitcher1

1

1: public class ImageSwitcher1 extends Activity implements
2: AdapterView.OnItemSelectedListener, ViewSwitcher.ViewFactory {//实现ViewFactory
3:
4: @Override
5: public void onCreate(Bundle savedInstanceState) {
6: super.onCreate(savedInstanceState);
7: requestWindowFeature(Window.FEATURE_NO_TITLE);
8:  
9: setContentView(R.layout.image_switcher_1);
10:  
11: mSwitcher = (ImageSwitcher) findViewById(R.id.switcher);
12: mSwitcher.setFactory(this);//注意
13: mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
14: android.R.anim.fade_in));
15: mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
16: android.R.anim.fade_out));
17:  
18: Gallery g = (Gallery) findViewById(R.id.gallery);
19: g.setAdapter(new ImageAdapter(this));
20: g.setOnItemSelectedListener(this);
21: }
22:  
23: //Gallery被选后设置ImageSwitcher的图片
24: public void onItemSelected(AdapterView parent, View v, int position, long id) {
25: mSwitcher.setImageResource(mImageIds[position]);
26: }
27:  
28: public void onNothingSelected(AdapterView parent) {
29: }
30:  
31: public View makeView() {//!!!!!!注意Creates a new View to be added in a ViewSwitcher.
32: ImageView i = new ImageView(this);
33: i.setBackgroundColor(0xFF000000);
34: i.setScaleType(ImageView.ScaleType.FIT_CENTER);
35: i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT,
36: LayoutParams.FILL_PARENT));
37: return i;
38: }
39:  
40: private ImageSwitcher mSwitcher;
41:  
42: public class ImageAdapter extends BaseAdapter {
43: public ImageAdapter(Context c) {
44: mContext = c;
45: }
46:  
47: public int getCount() {
48: return mThumbIds.length;
49: }
50:  
51: public Object getItem(int position) {
52: return position;
53: }
54:  
55: public long getItemId(int position) {
56: return position;
57: }
58:  
59: public View getView(int position, View convertView, ViewGroup parent) {
60: ImageView i = new ImageView(mContext);
61:  
62: i.setImageResource(mThumbIds[position]);
63: i.setAdjustViewBounds(true);//preserve the aspect ratio
64: i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT,
65: LayoutParams.WRAP_CONTENT));
66: i.setBackgroundResource(R.drawable.picture_frame);
67: return i;
68: }
69:  
70: private Context mContext;
71:  
72: }
73:  
74: private Integer[] mThumbIds = { R.drawable.sample_thumb_0,
75: R.drawable.sample_thumb_1, R.drawable.sample_thumb_2,
76: R.drawable.sample_thumb_3, R.drawable.sample_thumb_4,
77: R.drawable.sample_thumb_5, R.drawable.sample_thumb_6,
78: R.drawable.sample_thumb_7 };
79:  
80: private Integer[] mImageIds = { R.drawable.sample_0, R.drawable.sample_1,
81: R.drawable.sample_2, R.drawable.sample_3, R.drawable.sample_4,
82: R.drawable.sample_5, R.drawable.sample_6, R.drawable.sample_7 };
83:  
84: }

25.ImageView1:

1

只是布局:

可以看出android:adjustViewBounds="true"为保持比例。

android:maxWidth="50dip" android:maxHeight="50dip"限制图片的最大宽高image

android:maxWidth="70dip" android:maxHeight="70dip"  android:padding="10dip" 限制图片最大宽高并在图片周围填充空白10dipimage

android:padding="10dip" android:layout_width="70dip" android:layout_height="70dip" 图片设置宽高为70,并在图片周围填充空白image

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
4: android:layout_width="fill_parent"
5: android:layout_height="fill_parent">
6:
7: <LinearLayout
8: android:layout_width="fill_parent"
9: android:layout_height="fill_parent"
10: android:orientation="vertical">
11:
12: <!-- The following four examples use a large image -->
13: <!-- 1. Non-scaled view, for reference -->
14: <TextView
15: android:layout_width="fill_parent"
16: android:layout_height="wrap_content"
17: android:paddingTop="10dip"
18: android:text="@string/image_view_large_normal"/>
19: <ImageView
20: android:src="@drawable/sample_1"
21: android:adjustViewBounds="true"
22: android:layout_width="wrap_content"
23: android:layout_height="wrap_content" />
24:
25: <!-- 2. Limit to at most 50x50 -->
26: <TextView
27: android:layout_width="fill_parent"
28: android:layout_height="wrap_content"
29: android:paddingTop="10dip"
30: android:text="@string/image_view_large_at_most"/>
31: <ImageView
32: android:src="@drawable/sample_1"
33: android:adjustViewBounds="true"
34: android:maxWidth="50dip"
35: android:maxHeight="50dip"
36: android:layout_width="wrap_content"
37: android:layout_height="wrap_content" />
38:
39: <!-- 3. Limit to at most 70x70, with 10 pixels of padding all around -->
40: <TextView
41: android:layout_width="fill_parent"
42: android:layout_height="wrap_content"
43: android:paddingTop="10dip"
44: android:text="@string/image_view_large_at_most_padded"/>
45: <ImageView
46: android:src="@drawable/sample_1"
47: android:background="#66FFFFFF"
48: android:adjustViewBounds="true"
49: android:maxWidth="70dip"
50: android:maxHeight="70dip"
51: android:padding="10dip"
52: android:layout_width="wrap_content"
53: android:layout_height="wrap_content" />
54:
55: <!-- 4. Limit to exactly 70x70, with 10 pixels of padding all around -->
56: <TextView
57: android:layout_width="fill_parent"
58: android:layout_height="wrap_content"
59: android:paddingTop="10dip"
60: android:text="@string/image_view_large_exactly_padded"/>
61: <ImageView
62: android:src="@drawable/sample_1"
63: android:background="#66FFFFFF"
64: android:scaleType="centerInside"
65: android:padding="10dip"
66: android:layout_width="70dip"
67: android:layout_height="70dip" />
68:
69: <!-- Repeating the previous four examples with small image -->
70: <!-- 1. Non-scaled view, for reference -->
71: <TextView
72: android:layout_width="fill_parent"
73: android:layout_height="wrap_content"
74: android:paddingTop="10dip"
75: android:text="@string/image_view_small_normal"/>
76: <ImageView
77: android:src="@drawable/stat_happy"
78: android:background="#FFFFFFFF"
79: android:adjustViewBounds="true"
80: android:layout_width="wrap_content"
81: android:layout_height="wrap_content" />
82:
83: <!-- 2. Limit to at most 50x50 -->
84: <TextView
85: android:layout_width="fill_parent"
86: android:layout_height="wrap_content"
87: android:paddingTop="10dip"
88: android:text="@string/image_view_small_at_most"/>
89: <ImageView
90: android:src="@drawable/stat_happy"
91: android:background="#FFFFFFFF"
92: android:adjustViewBounds="true"
93: android:maxWidth="50dip"
94: android:maxHeight="50dip"
95: android:layout_width="wrap_content"
96: android:layout_height="wrap_content" />
97:
98: <!-- 3. Limit to at most 70x70, with 10 pixels of padding all around -->
99: <TextView
100: android:layout_width="fill_parent"
101: android:layout_height="wrap_content"
102: android:paddingTop="10dip"
103: android:text="@string/image_view_small_at_most_padded"/>
104: <ImageView
105: android:src="@drawable/stat_happy"
106: android:background="#FFFFFFFF"
107: android:adjustViewBounds="true"
108: android:maxWidth="70dip"
109: android:maxHeight="70dip"
110: android:padding="10dip"
111: android:layout_width="wrap_content"
112: android:layout_height="wrap_content" />
113:
114: <!-- 4. Limit to exactly 70x70, with 10 pixels of padding all around -->
115: <TextView
116: android:layout_width="fill_parent"
117: android:layout_height="wrap_content"
118: android:paddingTop="10dip"
119: android:text="@string/image_view_small_exactly_padded"/>
120: <ImageView
121: android:src="@drawable/stat_happy"
122: android:background="#FFFFFFFF"
123: android:scaleType="centerInside"
124: android:padding="10dip"
125: android:layout_width="70dip"
126: android:layout_height="70dip" />
127:
128:
129: </LinearLayout>
130: </ScrollView>
131:

26.LayoutAnimation2

此为一个ListActivity在加载时有个加载动画效果

1

注意:第9到24行为设置动画 此例了Alpha+Translate

1: public class LayoutAnimation2 extends ListActivity {
2: @Override
3: public void onCreate(Bundle savedInstanceState) {
4: super.onCreate(savedInstanceState);
5:  
6: setListAdapter(new ArrayAdapter<String>(this,
7: android.R.layout.simple_list_item_1mStrings));
8:  
9: AnimationSet set = new AnimationSet(true);
10:  
11: Animation animation = new AlphaAnimation(0.0f, 1.0f);
12: animation.setDuration(50);
13: set.addAnimation(animation);
14:  
15: animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,
16: Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, -1.0f,
17: Animation.RELATIVE_TO_SELF, 0.0f);
18: animation.setDuration(100);
19: set.addAnimation(animation);
20:
21: LayoutAnimationController controller = new LayoutAnimationController(set,
22: 0.5f);
23: ListView listView = getListView();
24: listView.setLayoutAnimation(controller);
25: }
26:
27: private String[] mStrings = { "Bordeaux""Lyon""Marseille""Nancy",
28: "Paris""Toulouse""Strasbourg" };
29: }

27.LayoutAnimation3

此为布局动画,在加载整个布局时的动画效果

1

布局XML

第7行说明此ListView加载了一个LayoutAnimation动画layout_bottom_to_top_slide

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <ListView xmlns:android="http://schemas.android.com/apk/res/android"
4: android:id="@android:id/list"
5: android:layout_width="fill_parent"
6: android:layout_height="fill_parent"
7: android:layoutAnimation="@anim/layout_bottom_to_top_slide" />
8:

layout_bottom_to_top_slide.xml 声音了一个LayoutAnimation动画如下:

第6行声明了一个animation动画为slide_right

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
4: android:delay="30%"
5: android:animationOrder="reverse"
6: android:animation="@anim/slide_right" />
7:

slide_right.xml如下

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <set xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_interpolator">
4: <translate android:fromXDelta="-100%p" android:toXDelta="0"
5: android:duration="@android:integer/config_shortAnimTime" />
6: </set>

28.LayoutAnimation4随机动态显示

1

布局里有个LayoutAnimation动画 layout_random_fade

1: <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/grid"
2: android:layoutAnimation="@anim/layout_random_fade"
3:
4: android:layout_width="fill_parent"
5: android:layout_height="fill_parent"
6: android:padding="10dp"
7: android:verticalSpacing="10dp"
8:
9: android:horizontalSpacing="10dp"
10: android:numColumns="auto_fit"
11: android:columnWidth="60dp"
12: android:stretchMode="columnWidth"
13:
14: android:gravity="center" />

layout_random_fade.xml动画如下:

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
4: android:delay="0.5"
5: android:animationOrder="random"
6: android:animation="@anim/fade" />

第6行又加载了动画fade

fade.xml如下

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <alpha xmlns:android="http://schemas.android.com/apk/res/android"
4: android:interpolator="@android:anim/accelerate_interpolator"
5: android:fromAlpha="0.0" android:toAlpha="1.0"
6: android:duration="@android:integer/config_longAnimTime" />
7:

 

29.LayoutAnimation5 以风格顺序方向显示

1 

布局:android:layoutAnimation="@anim/layout_grid_inverse_fade"的LayoutAnimation动画

1: <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/grid"
2: android:layoutAnimation="@anim/layout_grid_inverse_fade"
3:
4: android:layout_width="fill_parent"
5: android:layout_height="fill_parent"
6: android:padding="10dp"
7: android:verticalSpacing="10dp"
8:
9: android:horizontalSpacing="10dp"
10: android:numColumns="auto_fit"
11: android:columnWidth="60dp"
12: android:stretchMode="columnWidth"
13:
14: android:gravity="center" />

layout_grid_inverse_fade.xml动画

注意:此为gridLayoutAnimation ,动画方向:android:direction="right_to_left|bottom_to_top"

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <gridLayoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
4: android:columnDelay="0.5"
5: android:directionPriority="row"
6: android:direction="right_to_left|bottom_to_top"
7: android:animation="@anim/fade" />
8:

fade.xml如下

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <alpha xmlns:android="http://schemas.android.com/apk/res/android"
4: android:interpolator="@android:anim/accelerate_interpolator"
5: android:fromAlpha="0.0" android:toAlpha="1.0"
6: android:duration="@android:integer/config_longAnimTime" />
7:

30.LayoutAnimation6

布局:

注意:第4行的android:layoutAnimation="@anim/layout_wave_scale"

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/grid"
4: android:layoutAnimation="@anim/layout_wave_scale"
5:
6: android:layout_width="fill_parent"
7: android:layout_height="fill_parent"
8: android:verticalSpacing="10dp"
9:
10: android:horizontalSpacing="10dp"
11: android:numColumns="auto_fit"
12: android:columnWidth="60dp"
13: android:stretchMode="columnWidth"
14:
15: android:gravity="center" />

layout_wave_scale.xml动画如下:

注意:此为gridLayoutAnimation

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <gridLayoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
4: android:rowDelay="75%"
5: android:columnDelay="0%"
6: android:directionPriority="none"
7: android:animation="@anim/wave_scale" />
8:

wave_scale.xml动画如下:

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <set xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_interpolator">
4: <alpha
5: android:fromAlpha="0.0"
6: android:toAlpha="1.0"
7: android:duration="100" />
8: <scale
9: android:fromXScale="0.5" android:toXScale="1.5"
10: android:fromYScale="0.5" android:toYScale="1.5"
11: android:pivotX="50%" android:pivotY="50%"
12: android:duration="200" />
13: <scale
14: android:fromXScale="1.5" android:toXScale="1.0"
15: android:fromYScale="1.5" android:toYScale="1.0"
16: android:pivotX="50%" android:pivotY="50%"
17: android:startOffset="200"
18: android:duration="100" />
19: </set>

31.LayoutAnimation7

布局:

注意:TableLayout中加入了多个TableRow 每个TableRow里有一个TextView和一个EditView,每个TableRow里有分别有一个动画

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:layoutAnimation="@anim/layout_animation_table"
5: android:animationCache="false"
6: android:clipToPadding="false"
7: android:padding="12dp"
8: android:layout_width="fill_parent"
9: android:layout_height="fill_parent"
10: android:stretchColumns="1">
11:
12: <TableRow
13: android:layoutAnimation="@anim/layout_animation_row_right_slide">
14: <TextView
15: android:gravity="right"
16: android:text="@string/layout_animation_name" />
17: <EditText />
18: </TableRow>
19:
20: <TableRow
21: android:layoutAnimation="@anim/layout_animation_row_left_slide">
22: <TextView
23: android:gravity="right"
24: android:text="@string/layout_animation_lastname" />
25: <EditText />
26: </TableRow>
27:
28: <TableRow
29: android:layoutAnimation="@anim/layout_animation_row_right_slide">
30: <TextView
31: android:gravity="right"
32: android:text="@string/layout_animation_phone" />
33: <EditText />
34: </TableRow>
35:
36: <TableRow
37: android:layoutAnimation="@anim/layout_animation_row_left_slide">
38: <TextView
39: android:gravity="right"
40: android:text="@string/layout_animation_address" />
41: <EditText android:lines="3" />
42: </TableRow>
43: </TableLayout>
44:

第41行<EditText android:lines="3" />image

动画layout_animation_row_left_slide.xml

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
4: android:delay="10%"
5: android:animation="@anim/slide_left" />
6:

第6行 slide_left动画:

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <set xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_interpolator">
4: <translate android:fromXDelta="100%p" android:toXDelta="0"
5: android:duration="@android:integer/config_shortAnimTime" />
6: </set>

动画layout_animation_row_right_slide.xml

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
4: android:delay="10%"
5: android:animationOrder="reverse"
6: android:animation="@anim/slide_right" />
7:

  第6行 slide_right动画:

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <set xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_interpolator">
4: <translate android:fromXDelta="-100%p" android:toXDelta="0"
5: android:duration="@android:integer/config_shortAnimTime" />
6: </set>
7:

32.LinearLayout3

1

布局:

注意:第三个TextView android:layout_weight="1",activity根据这个View的比0大的layout_weight值来划分剩余的空间和其它Views定义的layout_weight也按比例进行空间的划分

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!--
4: Demonstrates a simple linear layout. The layout fills the screen, with the
5: children stacked from the top. The middle child gets allocated any extra
6: space.
7: -->
8:
9: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
10: android:orientation="vertical"
11: android:background="@drawable/blue"
12: android:layout_width="fill_parent"
13: android:layout_height="fill_parent">
14:
15: <!-- view1 goes on top -->
16: <TextView
17: android:background="@drawable/box"
18: android:layout_width="fill_parent"
19: android:layout_height="wrap_content"
20: android:text="@string/linear_layout_3_top"/>
21:
22: <!-- view2 goes in the middle -->
23: <TextView
24: android:background="@drawable/box"
25: android:layout_width="fill_parent"
26: android:layout_height="wrap_content"
27: android:layout_weight="1"
28: android:text="@string/linear_layout_3_middle"/>
29:
30: <!-- view3 goes on the bottom -->
31: <TextView
32: android:background="@drawable/box"
33: android:layout_width="fill_parent"
34: android:layout_height="wrap_content"
35: android:text="@string/linear_layout_3_bottom"/>
36:
37: </LinearLayout>
38:

33.LinearLayout4

1

布局:

注意:每个TextView的android:layout_weight="1" android:layout_height="fill_parent"

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!--
4: Demonstrates a horizontal linear layout with equally sized columns
5: -->
6:
7: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
8: android:orientation="horizontal"
9: android:layout_width="fill_parent"
10: android:layout_height="fill_parent">
11:
12: <TextView
13: android:background="@drawable/red"
14: android:layout_width="0dip"
15: android:layout_height="fill_parent"
16: android:layout_weight="1"/>
17:
18: <TextView
19: android:background="@drawable/green"
20: android:layout_width="0dip"
21: android:layout_height="fill_parent"
22: android:layout_weight="1"/>
23:
24: <TextView
25: android:background="@drawable/blue"
26: android:layout_width="0dip"
27: android:layout_height="fill_parent"
28: android:layout_weight="1"/>
29:
30: <TextView
31: android:background="@drawable/yellow"
32: android:layout_width="0dip"
33: android:layout_height="fill_parent"
34: android:layout_weight="1"/>
35:
36: </LinearLayout>
37:

34.LinearLayout5

1

布局:

注意:第33行android:background="@android:drawable/editbox_background" 设置了EditView的背景样子

第43行又加了一个LinearLayout放两个按钮,第47行android:layout_gravity="right" 设置两按钮右边对齐

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!--
4: Demonstrates a nesting layouts to make a form
5: -->
6:
7: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
8: android:orientation="vertical"
9: android:background="@drawable/blue"
10: android:layout_width="fill_parent"
11: android:layout_height="wrap_content"
12: android:padding="10dip">
13:
14: <!--
15: TextView goes on top...
16: -->
17: <TextView
18: android:layout_width="fill_parent"
19: android:layout_height="wrap_content"
20: android:text="@string/linear_layout_5_instructions"/>
21:
22: <!--
23: Followed by the EditText field...
24:
25: Also give it a standard background (the "android:"
26: part in @android:drawable/editbox_background
27: means it is system resource rather than
28: an application resource.
29: -->
30: <EditText
31: android:layout_width="fill_parent"
32: android:layout_height="wrap_content"
33: android:background="@android:drawable/editbox_background"/>
34:
35: <!--
36: Use a horizontal layout to hold the two buttons.
37: This item has layout_gravity="right". This means the whole
38: horizontal LinearLayout is right aligned, not the individual
39: items within it. The horizontal LinearLayout's width is set to
40: wrap_content. (If it was fill_parent it would not have any
41: room to slide to the right.)
42: -->
43: <LinearLayout
44: android:orientation="horizontal"
45: android:layout_width="wrap_content"
46: android:layout_height="wrap_content"
47: android:layout_gravity="right" >
48:
49: <Button
50: android:layout_width="wrap_content"
51: android:layout_height="wrap_content"
52: android:text="@string/linear_layout_5_cancel"/>
53:
54: <Button
55: android:layout_width="wrap_content"
56: android:layout_height="wrap_content"
57: android:layout_marginLeft="10dip"
58: android:text="@string/linear_layout_5_ok" />
59:
60: </LinearLayout>
61:
62: </LinearLayout>

35.LinearLayout6

1

此例子在LinearLayout 布局中加入了android:padding="20dip"  android:layout_width="wrap_content"android:layout_height="wrap_content"

布局:

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!--
4: LinearLayout which uses a combination of wrap_content on itself and
5: fill_parent on its children to get every item to be the same width.
6: -->
7:
8: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
9: android:orientation="vertical"
10: android:background="@drawable/blue"
11: android:padding="20dip"
12: android:layout_width="wrap_content"
13: android:layout_height="wrap_content">
14:
15: <TextView
16: android:background="@drawable/box"
17: android:layout_width="fill_parent"
18: android:layout_height="wrap_content"
19: android:text="@string/linear_layout_6_one"/>
20:
21: <TextView
22: android:background="@drawable/box"
23: android:layout_width="fill_parent"
24: android:layout_height="wrap_content"
25: android:text="@string/linear_layout_6_two"/>
26:
27: <TextView
28: android:background="@drawable/box"
29: android:layout_width="fill_parent"
30: android:layout_height="wrap_content"
31: android:text="@string/linear_layout_6_three"/>
32:
33: <TextView
34: android:background="@drawable/box"
35: android:layout_width="fill_parent"
36: android:layout_height="wrap_content"
37: android:text="@string/linear_layout_6_four"/>
38:
39: </LinearLayout>

36.LinearLayout7

1

布局:

注意:主要起作用的是第8行android:layout_width="fill_parent"和第15行android:layout_weight="1"

1: <?xml version="1.0" encoding="utf-8"?>
2: <!--
3: Demonstrates a horizontal linear layout with equally sized columns.
4: Some columns force their height to match the parent.
5: -->
6:
7: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal"
8: android:layout_width="fill_parent"
9: android:layout_height="wrap_content">
10:
11: <TextView
12: android:background="@drawable/red"
13: android:layout_width="0dip"
14: android:layout_height="fill_parent"
15: android:layout_weight="1"
16: android:text="@string/linear_layout_7_small"/>
17:
18: <TextView
19: android:background="@drawable/green"
20: android:layout_width="0dip"
21: android:layout_height="fill_parent"
22: android:layout_weight="1"
23: android:text="@string/linear_layout_7_big"/>
24:
25: <TextView
26: android:background="@drawable/blue"
27: android:layout_width="0dip"
28: android:layout_height="fill_parent"
29: android:layout_weight="1"
30: android:text="@string/linear_layout_7_small" />
31:
32: <TextView
33: android:background="@drawable/yellow"
34: android:layout_width="0dip"
35: android:layout_height="wrap_content"
36: android:layout_weight="1"
37: android:text="@string/linear_layout_7_wrap"/>
38:
39: </LinearLayout>

37.LinearLayout8

在菜单里可以动态改变LinearLayout的布局

1

原布局:

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!--
4: Demonstrates a simple linear layout. The layout fills the screen, with the
5: children stacked from the top.
6: -->
7: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
8: android:layout_width="fill_parent"
9: android:layout_height="fill_parent"
10: android:padding="30dip">
11: <LinearLayout
12: android:id="@+id/layout"
13: android:orientation="vertical"
14: android:background="@drawable/blue"
15: android:layout_width="fill_parent"
16: android:layout_height="fill_parent"
17: android:padding="30dip">
18:
19: <TextView
20: android:background="@drawable/box"
21: android:layout_width="wrap_content"
22: android:layout_height="wrap_content"
23: android:text="@string/linear_layout_8_c"/>
24:
25: <TextView
26: android:background="@drawable/box"
27: android:layout_width="wrap_content"
28: android:layout_height="wrap_content"
29: android:text="@string/linear_layout_8_b"/>
30:
31: <TextView
32: android:background="@drawable/box"
33: android:layout_width="wrap_content"
34: android:layout_height="wrap_content"
35: android:text="@string/linear_layout_8_c"/>
36:
37: </LinearLayout>
38:
39: </FrameLayout>
40:

菜单的onOptionsItemSelected方法:

1: @Override
2: public boolean onOptionsItemSelected(MenuItem item) {
3: switch (item.getItemId()) {
4:  
5: case VERTICAL_ID:
6: mLinearLayout.setOrientation(LinearLayout.VERTICAL);
7: return true;
8: case HORIZONTAL_ID:
9: mLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
10: return true;
11:  
12: case TOP_ID:
13: mLinearLayout.setVerticalGravity(Gravity.TOP);
14: return true;
15: case MIDDLE_ID:
16: mLinearLayout.setVerticalGravity(Gravity.CENTER_VERTICAL);
17: return true;
18: case BOTTOM_ID:
19: mLinearLayout.setVerticalGravity(Gravity.BOTTOM);
20: return true;
21:  
22: case LEFT_ID:
23: mLinearLayout.setHorizontalGravity(Gravity.LEFT);
24: return true;
25: case CENTER_ID:
26: mLinearLayout.setHorizontalGravity(Gravity.CENTER_HORIZONTAL);
27: return true;
28: case RIGHT_ID:
29: mLinearLayout.setHorizontalGravity(Gravity.RIGHT);
30: return true;
31:  
32: }
33: return super.onOptionsItemSelected(item);
34: }

38.LinearLayout9 下面的Button一直在屏幕的底部

1

布局:

Button一直在屏幕的底部主要是因为第16行的android:layout_weight="1.0"

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!--
4: Demonstrates a simple linear layout. The layout fills the screen, with the
5: children stacked from the top.
6: -->
7:
8: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
9: android:orientation="vertical"
10: android:layout_width="fill_parent"
11: android:layout_height="fill_parent">
12:
13: <ListView android:id="@+id/list"
14: android:layout_width="fill_parent"
15: android:layout_height="wrap_content"
16: android:layout_weight="1.0" />
17:
18: <Button
19: android:layout_width="fill_parent"
20: android:layout_height="wrap_content"
21: android:text="@string/linear_layout_9_button" />
22:
23: </LinearLayout>

39.LinearLayout10

1

第一个条的布局:

1: <LinearLayout
2: android:layout_width="fill_parent"
3: android:layout_height="wrap_content"
4: android:addStatesFromChildren="true"
5: android:gravity="center_vertical"
6: android:paddingRight="0dip"
7: android:background="@android:drawable/edit_text">
8:
9: <!--
10: TextView label goes at the left.
11: -->
12: <TextView
13: android:layout_width="wrap_content"
14: android:layout_height="wrap_content"
15: android:text="@string/linear_layout_10_from"
16: android:textColor="?android:attr/textColorSecondary"
17: android:textAppearance="?android:attr/textAppearanceLargeInverse"
18: />
19:
20: <!--
21: EditText goes in between.
22: -->
23: <EditText
24: android:layout_width="wrap_content"
25: android:layout_height="wrap_content"
26: android:layout_weight="1"
27: android:singleLine="true"
28: android:background="@null"
29: />
30:
31: <!--
32: The button goes at the right.
33: -->
34: <ImageButton
35: style="@android:style/Widget.Button.Inset"
36: android:src="@android:drawable/star_big_on"
37: android:layout_width="wrap_content"
38: android:layout_height="wrap_content"
39: android:layout_marginTop="2dip"
40: android:layout_marginRight="2dip"
41: android:layout_marginBottom="2dip"
42: android:padding="10dip"
43: />
44:
45: </LinearLayout>

40.RelativeLayout1 相对布局

1

布局:

注意:第18行android:layout_alignParentTop="true"

第27行android:layout_alignParentBottom="true"

第36,37行android:layout_above="@id/view2"  android:layout_below="@id/view1"

1: <?xml version="1.0" encoding="utf-8"?>
2:
3:
4: <!--
5: Demonstrates stretching a view to fill the space between two other views
6: -->
7:
8: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
9: android:layout_width="fill_parent"
10: android:layout_height="fill_parent">
11:
12: <!-- view1 goes on top -->
13: <TextView
14: android:id="@+id/view1"
15: android:background="@drawable/red"
16: android:layout_width="fill_parent"
17: android:layout_height="wrap_content"
18: android:layout_alignParentTop="true"
19: android:text="@string/relative_layout_1_top"/>
20:
21: <!-- view2 goes on the bottom -->
22: <TextView
23: android:id="@+id/view2"
24: android:background="@drawable/green"
25: android:layout_width="fill_parent"
26: android:layout_height="wrap_content"
27: android:layout_alignParentBottom="true"
28: android:text="@string/relative_layout_1_bottom"/>
29:
30: <!-- view3 stretches betweeen view1 and view2 -->
31: <TextView
32: android:id="@+id/view3"
33: android:background="@drawable/yellow"
34: android:layout_width="fill_parent"
35: android:layout_height="0dip"
36: android:layout_above="@id/view2"
37: android:layout_below="@id/view1"
38: android:text="@string/relative_layout_1_center"/>
39:
40: </RelativeLayout>

41.ScrollView2   一共64个TextView和button

1

布局:

1: <?xml version="1.0" encoding="utf-8"?>
2:
3:
4: <!-- Demonstrates scrolling with a ScrollView. -->
5:
6: <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
7: android:layout_width="fill_parent"
8: android:layout_height="wrap_content"
9: android:scrollbars="none">
10:
11: <LinearLayout
12: android:id="@+id/layout"
13: android:orientation="vertical"
14: android:layout_width="fill_parent"
15: android:layout_height="wrap_content">
16:
17: <TextView
18: android:layout_width="fill_parent"
19: android:layout_height="wrap_content"
20: android:text="@string/scroll_view_2_text_1"/>
21:
22: <Button
23: android:layout_width="fill_parent"
24: android:layout_height="wrap_content"
25: android:text="@string/scroll_view_2_button_1"/>
26:
27: </LinearLayout>
28: </ScrollView>

在OnCreat()里动态填加 View

1: protected void onCreate(Bundle savedInstanceState) {
2: super.onCreate(savedInstanceState);
3: setContentView(R.layout.scroll_view_2);
4:  
5: LinearLayout layout = (LinearLayout) findViewById(R.id.layout);
6: for (int i = 2; i < 64; i++) {
7: TextView textView = new TextView(this);
8: textView.setText("Text View " + i);
9: LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
10: LinearLayout.LayoutParams.FILL_PARENT,
11: LinearLayout.LayoutParams.WRAP_CONTENT
12: );
13: layout.addView(textView, p);
14:  
15: Button buttonView = new Button(this);
16: buttonView.setText("Button " + i);
17: layout.addView(buttonView, p);
18: }
19: }

42.TableLayout1

TableLayout里由<TableRow><TableRow/>组成

1

布局:

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:layout_width="fill_parent"
5: android:layout_height="fill_parent">
6:
7: <TableRow>
8: <TextView
9: android:text="@string/table_layout_1_star"
10: android:padding="3dip" />
11: <TextView
12: android:text="@string/table_layout_1_open"
13: android:padding="3dip" />
14: <TextView
15: android:text="@string/table_layout_1_open_shortcut"
16: android:padding="3dip" />
17: </TableRow>
18:
19: <TableRow>
20: <TextView
21: android:text="@string/table_layout_1_triple_star"
22: android:padding="3dip" />
23: <TextView
24: android:text="@string/table_layout_1_save"
25: android:padding="3dip" />
26: <TextView
27: android:text="@string/table_layout_1_save_shortcut"
28: android:padding="3dip" />
29: </TableRow>
30:
31: <TableRow>
32: <TextView
33: android:text="@string/table_layout_1_star"
34: android:padding="3dip" />
35: <TextView
36: android:text="@string/table_layout_1_quit"
37: android:padding="3dip" />
38: <TextView
39: android:text="@string/table_layout_1_quit_shortcut"
40: android:padding="3dip" />
41: </TableRow>
42: </TableLayout>
43:

43.TableLayout2

1

布局:在空的地方不加控件

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:layout_width="fill_parent"
5: android:layout_height="fill_parent">
6:
7: <TableRow>
8: <Button
9: android:text="@string/table_layout_2_open" />
10: <TextView
11: android:text="@string/table_layout_2_path_1"
12: android:padding="3dip" />
13: </TableRow>
14: <TableRow>
15: <Button
16: android:text="@string/table_layout_2_save_all"/>
17: </TableRow>
18: <TableRow>
19: <Button
20: android:text="@string/table_layout_2_save"
21: android:visibility="invisible" />
22: <TextView
23: android:text="@string/table_layout_2_path_2"
24: android:padding="3dip" />
25: </TableRow>
26: </TableLayout>
27:

44.TableLayout4此表格布局一行中的两个TextView分布在左右两端

1

布局:

注意:关键在第7行和第15行,android:stretchColumns="1" android:gravity="right"

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!-- Stretch some columns -->
4: <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
5: android:layout_width="fill_parent"
6: android:layout_height="fill_parent"
7: android:stretchColumns="1">
8:
9: <TableRow>
10: <TextView
11: android:text="@string/table_layout_4_open"
12: android:padding="3dip" />
13: <TextView
14: android:text="@string/table_layout_4_open_shortcut"
15: android:gravity="right"
16: android:padding="3dip" />
17: </TableRow>
18:
19: <TableRow>
20: <TextView
21: android:text="@string/table_layout_4_save"
22: android:padding="3dip" />
23: <TextView
24: android:text="@string/table_layout_4_save_shortcut"
25: android:gravity="right"
26: android:padding="3dip" />
27: </TableRow>
28: </TableLayout>
29:

45.TableLayout5

1

布局:

注意:第7行和第15行

还有横线的画法:

39: <View
40: android:layout_height="2dip"
41: android:background="#FF909090" />
1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!-- Stretch some columns -->
4: <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
5: android:layout_width="fill_parent"
6: android:layout_height="fill_parent"
7: android:stretchColumns="1">
8:
9: <TableRow>
10: <TextView
11: android:text="@string/table_layout_5_open"
12: android:padding="3dip" />
13: <TextView
14: android:text="@string/table_layout_5_open_shortcut"
15: android:gravity="right"
16: android:padding="3dip" />
17: </TableRow>
18:
19: <TableRow>
20: <TextView
21: android:text="@string/table_layout_5_save"
22: android:padding="3dip" />
23: <TextView
24: android:text="@string/table_layout_5_save_shortcut"
25: android:gravity="right"
26: android:padding="3dip" />
27: </TableRow>
28:
29: <TableRow>
30: <TextView
31: android:text="@string/table_layout_5_save_as"
32: android:padding="3dip" />
33: <TextView
34: android:text="@string/table_layout_5_save_as_shortcut"
35: android:gravity="right"
36: android:padding="3dip" />
37: </TableRow>
38:
39: <View
40: android:layout_height="2dip"
41: android:background="#FF909090" />
42:
43: <TableRow>
44: <TextView
45: android:text="@string/table_layout_5_import"
46: android:padding="3dip" />
47: </TableRow>
48:
49: <TableRow>
50: <TextView
51: android:text="@string/table_layout_5_export"
52: android:padding="3dip" />
53: <TextView
54: android:text="@string/table_layout_5_export_shortcut"
55: android:gravity="right"
56: android:padding="3dip" />
57: </TableRow>
58:
59: <View
60: android:layout_height="2dip"
61: android:background="#FF909090" />
62:
63: <TableRow>
64: <TextView
65: android:text="@string/table_layout_5_quit"
66: android:padding="3dip" />
67: </TableRow>
68: </TableLayout>
69:

46.TableLayout6

1

布局:

注意:第12行的12: android:layout_column="1" 声明它在表格的第1列

1: <?xml version="1.0" encoding="utf-8"?>
2:
3:
4: <!-- Stretch some columns -->
5: <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
6: android:layout_width="fill_parent"
7: android:layout_height="fill_parent"
8: android:stretchColumns="1">
9:
10: <TableRow>
11: <TextView
12: android:layout_column="1"
13: android:text="@string/table_layout_6_open"
14: android:padding="3dip" />
15: <TextView
16: android:text="@string/table_layout_6_open_shortcut"
17: android:gravity="right"
18: android:padding="3dip" />
19: </TableRow>
20:
21: <TableRow>
22: <TextView
23: android:layout_column="1"
24: android:text="@string/table_layout_6_save"
25: android:padding="3dip" />
26: <TextView
27: android:text="@string/table_layout_6_save_shortcut"
28: android:gravity="right"
29: android:padding="3dip" />
30: </TableRow>
31:
32: <TableRow>
33: <TextView
34: android:layout_column="1"
35: android:text="@string/table_layout_6_save_as"
36: android:padding="3dip" />
37: <TextView
38: android:text="@string/table_layout_6_save_as_shortcut"
39: android:gravity="right"
40: android:padding="3dip" />
41: </TableRow>
42:
43: <View
44: android:layout_height="2dip"
45: android:background="#FF909090" />
46:
47: <TableRow>
48: <TextView
49: android:text="@string/table_layout_6_x"
50: android:padding="3dip" />
51: <TextView
52: android:text="@string/table_layout_6_import"
53: android:padding="3dip" />
54: </TableRow>
55:
56: <TableRow>
57: <TextView
58: android:text="@string/table_layout_6_x"
59: android:padding="3dip" />
60: <TextView
61: android:text="@string/table_layout_6_export"
62: android:padding="3dip" />
63: <TextView
64: android:text="@string/table_layout_6_export_shortcut"
65: android:gravity="right"
66: android:padding="3dip" />
67: </TableRow>
68:
69: <View
70: android:layout_height="2dip"
71: android:background="#FF909090" />
72:
73: <TableRow>
74: <TextView
75: android:layout_column="1"
76: android:text="@string/table_layout_6_quit"
77: android:padding="3dip" />
78: </TableRow>
79: </TableLayout>
80:

47.TableLayout7 下面的按钮可以隐藏表格的某行

1

布局:

注意:第12行android:collapseColumns="2" 表明隐藏第2列

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:orientation="vertical"
5: android:layout_width="fill_parent"
6: android:layout_height="fill_parent">
7: <TableLayout
8: android:id="@+id/menu"
9: android:layout_width="fill_parent"
10: android:layout_height="wrap_content"
11: android:stretchColumns="1"
12: android:collapseColumns="2">
13:
14: <TableRow>
15: <TextView
16: android:layout_column="1"
17: android:text="@string/table_layout_7_open"
18: android:padding="3dip" />
19: <TextView
20: android:text="@string/table_layout_7_open_shortcut"
21: android:gravity="right"
22: android:padding="3dip" />
23: </TableRow>
24:
25: <TableRow>
26: <TextView
27: android:layout_column="1"
28: android:text="@string/table_layout_7_save"
29: android:padding="3dip" />
30: <TextView
31: android:text="@string/table_layout_7_save_shortcut"
32: android:gravity="right"
33: android:padding="3dip" />
34: </TableRow>
35:
36: <TableRow>
37: <TextView
38: android:layout_column="1"
39: android:text="@string/table_layout_7_save_as"
40: android:padding="3dip" />
41: <TextView
42: android:text="@string/table_layout_7_save_as_shortcut"
43: android:gravity="right"
44: android:padding="3dip" />
45: </TableRow>
46:
47: <View
48: android:layout_height="2dip"
49: android:background="#FF909090" />
50:
51: <TableRow>
52: <TextView
53: android:text="@string/table_layout_7_x"
54: android:padding="3dip" />
55: <TextView
56: android:text="@string/table_layout_7_import"
57: android:padding="3dip" />
58: </TableRow>
59:
60: <TableRow>
61: <TextView
62: android:text="@string/table_layout_7_x"
63: android:padding="3dip" />
64: <TextView
65: android:text="@string/table_layout_7_export"
66: android:padding="3dip" />
67: <TextView
68: android:text="@string/table_layout_7_export_shortcut"
69: android:gravity="right"
70: android:padding="3dip" />
71: </TableRow>
72:
73: <View
74: android:layout_height="2dip"
75: android:background="#FF909090" />
76: </TableLayout>
77:
78: <LinearLayout
79: android:layout_width="wrap_content"
80: android:layout_height="wrap_content">
81: <Button
82: android:id="@+id/toggle2"
83: android:layout_width="wrap_content"
84: android:layout_height="wrap_content"
85: android:text="@string/table_layout_7_toggle_checkmarks" />
86: <Button
87: android:id="@+id/toggle1"
88: android:layout_width="wrap_content"
89: android:layout_height="wrap_content"
90: android:text="@string/table_layout_7_toggle_shortcuts" />
91: </LinearLayout>
92: </LinearLayout>
93:

两个按钮事件:

1: final TableLayout table = (TableLayout) findViewById(R.id.menu);
2: Button button = (Button) findViewById(R.id.toggle1);
3: button.setOnClickListener(new Button.OnClickListener() {
4: public void onClick(View v) {
5: mShortcutsCollapsed = !mShortcutsCollapsed;
6: table.setColumnCollapsed(2, mShortcutsCollapsed);
7: }
8: });
9: button = (Button) findViewById(R.id.toggle2);
10: button.setOnClickListener(new Button.OnClickListener() {
11: public void onClick(View v) {
12: mCheckmarksCollapsed = !mCheckmarksCollapsed;
13: table.setColumnCollapsed(0, mCheckmarksCollapsed);
14: }
15: });

48.TableLayout8  按钮可以设置Stretch

1

按钮事件:

1: final TableLayout table = (TableLayout) findViewById(R.id.menu);
2: Button button = (Button) findViewById(R.id.toggle);
3: button.setOnClickListener(new Button.OnClickListener() {
4: public void onClick(View v) {
5: mStretch = !mStretch;
6: table.setColumnStretchable(1, mStretch);
7: }
8: });

49.TableLayout9

1 1

按钮事件:

1: final TableLayout table = (TableLayout) findViewById(R.id.menu);
2: Button button = (Button) findViewById(R.id.toggle);
3: button.setOnClickListener(new Button.OnClickListener() {
4: public void onClick(View v) {
5: mShrink = !mShrink;
6: table.setColumnShrinkable(0, mShrink);
7: }
8: });

setColumnShrinkable的解释:

Makes the given column shrinkable or not. When a row is too wide, the table can reclaim extra space from shrinkable columns.

Calling this method requests a layout operation.

50.TableLayout10

1

布局:

注意:android:stretchColumns="1" 才有拉申效果

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:layout_width="fill_parent"
5: android:layout_height="fill_parent"
6: android:stretchColumns="1">
7:
8: <TableRow>
9: <TextView
10: android:text="@string/table_layout_10_user"
11: android:textStyle="bold"
12: android:gravity="right"
13: android:padding="3dip" />
14:
15: <EditText android:id="@+id/username"
16: android:text="@string/table_layout_10_username_text"
17: android:padding="3dip"
18: android:scrollHorizontally="true" />
19: </TableRow>
20:
21: <TableRow>
22: <TextView
23: android:text="@string/table_layout_10_password"
24: android:textStyle="bold"
25: android:gravity="right"
26: android:padding="3dip" />
27:
28: <EditText android:id="@+id/password"
29: android:text="@string/table_layout_10_password_text"
30: android:password="true"
31: android:padding="3dip"
32: android:scrollHorizontally="true" />
33: </TableRow>
34:
35: <TableRow
36: android:gravity="right">
37:
38: <Button android:id="@+id/cancel"
39: android:text="@string/table_layout_10_cancel" />
40:
41: <Button android:id="@+id/login"
42: android:text="@string/table_layout_10_login" />
43: </TableRow>
44: </TableLayout>
45:

51.TableLayout11

1

布局:

注意:第6行和第37行

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:layout_width="fill_parent"
5: android:layout_height="wrap_content"
6: android:stretchColumns="1">
7:
8: <TableRow>
9: <TextView
10: android:layout_column="1"
11: android:text="@string/table_layout_7_open"
12: android:padding="3dip" />
13: <TextView
14: android:text="@string/table_layout_7_open_shortcut"
15: android:gravity="right"
16: android:padding="3dip" />
17: </TableRow>
18:
19: <TableRow>
20: <TextView
21: android:layout_column="1"
22: android:text="@string/table_layout_7_save"
23: android:background="#FF00FF00"
24: android:padding="3dip" />
25: <TextView
26: android:text="@string/table_layout_7_save_shortcut"
27: android:gravity="right"
28: android:padding="3dip" />
29: </TableRow>
30:
31: <TableRow>
32: <!-- Horizontally centers the content of the cell -->
33: <TextView
34: android:layout_column="1"
35: android:text="@string/table_layout_7_save_as"
36: android:background="#FFFF0000"
37: android:layout_gravity="center_horizontal"
38: android:padding="3dip" />
39: <TextView
40: android:text="@string/table_layout_7_save_as_shortcut"
41: android:background="#FFFF00FF"
42: android:gravity="right"
43: android:padding="3dip" />
44: </TableRow>
45:
46: <View
47: android:layout_height="2dip"
48: android:background="#FF909090" />
49:
50: <TableRow>
51: <TextView
52: android:text="@string/table_layout_7_x"
53: android:padding="3dip" />
54: <TextView
55: android:text="@string/table_layout_7_import"
56: android:padding="3dip" />
57: </TableRow>
58:
59: <TableRow>
60: <View
61: android:layout_height="68dip"
62: android:background="#FF909090" />
63: <!-- Aligns the content of the cell to the bottom right -->
64: <TextView
65: android:text="@string/table_layout_7_export"
66: android:background="#FFFF0000"
67: android:layout_gravity="right|bottom"
68: android:padding="3dip" />
69: <TextView
70: android:text="@string/table_layout_7_export_shortcut"
71: android:background="#FF00FFFF"
72: android:gravity="right"
73: android:padding="3dip" />
74: </TableRow>
75:
76: <View
77: android:layout_height="2dip"
78: android:background="#FF909090" />
79: </TableLayout>
80:

52.TableLayout12

1

布局:

注意:第26行android:layout_span="2"表明这个TextView跨2个格

1: <?xml version="1.0" encoding="utf-8"?>
2:
3:
4: <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
5: android:layout_width="fill_parent"
6: android:layout_height="wrap_content">
7:
8: <TableRow>
9: <TextView
10: android:text="@string/table_layout_12_a"
11: android:background="#FFFF0000"
12: android:padding="3dip" />
13: <TextView
14: android:text="@string/table_layout_12_b"
15: android:background="#FF00FF00"
16: android:padding="3dip" />
17: <TextView
18: android:text="@string/table_layout_12_c"
19: android:background="#FF0000FF"
20: android:padding="3dip" />
21: </TableRow>
22:
23: <TableRow>
24: <TextView
25: android:text="@string/table_layout_12_d"
26: android:layout_span="2"
27: android:gravity="center_horizontal"
28: android:background="#FF0000FF"
29: android:padding="3dip" />
30: <TextView
31: android:text="@string/table_layout_12_e"
32: android:background="#FF00FF00"
33: android:padding="3dip" />
34: </TableRow>
35:
36: <TableRow>
37: <TextView
38: android:text="@string/table_layout_12_f"
39: android:background="#FFFF00FF"
40: android:padding="3dip" />
41: <TextView
42: android:text="@string/table_layout_12_g"
43: android:background="#FF00FF00"
44: android:padding="3dip" />
45: <TextView
46: android:text="@string/table_layout_12_h"
47: android:background="#FFFF0000"
48: android:padding="3dip" />
49: </TableRow>
50:
51: <TableRow>
52: <TextView
53: android:text="@string/table_layout_12_a"
54: android:background="#FF00FF00"
55: android:padding="3dip" />
56: <TextView
57: android:text="@string/table_layout_12_b"
58: android:layout_span="2"
59: android:gravity="center_horizontal"
60: android:background="#FF0000FF"
61: android:padding="3dip" />
62: </TableRow>
63:
64: <TableRow>
65: <TextView
66: android:text="@string/table_layout_12_g"
67: android:layout_span="3"
68: android:gravity="center_horizontal"
69: android:background="#FFC0C0C0"
70: android:padding="3dip" />
71: </TableRow>
72: </TableLayout>
73:

53.List4 在List里又从新设置了一个LinearLayout布局

1

源码:见List4

1: public void onCreate(Bundle savedInstanceState) {
2: super.onCreate(savedInstanceState);
3:  
4: // Use our own list adapter
5: setListAdapter(new SpeechListAdapter(this));
6: }

54.List5

image 为没能点的空白

1

源码:第22行的方法isEnabled为判断是否为分隔符

1: public void onCreate(Bundle savedInstanceState) {
2: super.onCreate(savedInstanceState);
3:  
4: setListAdapter(new MyListAdapter(this));
5: }
6:  
7: private class MyListAdapter extends BaseAdapter {
8: public MyListAdapter(Context context) {
9: mContext = context;
10: }
11:  
12: public int getCount() {
13: return mStrings.length;
14: }
15:  
16: @Override
17: public boolean areAllItemsEnabled() {
18: return false;
19: }
20:  
21: @Override
22: public boolean isEnabled(int position) {
23: return !mStrings[position].startsWith("-");
24: }
25:  
26: public Object getItem(int position) {
27: return position;
28: }
29:  
30: public long getItemId(int position) {
31: return position;
32: }
33:  
34: public View getView(int position, View convertView, ViewGroup parent) {
35: TextView tv;
36: if (convertView == null) {
37: tv = (TextView) LayoutInflater.from(mContext).inflate(
38: android.R.layout.simple_expandable_list_item_1, parent, false);
39: else {
40: tv = (TextView) convertView;
41: }
42: tv.setText(mStrings[position]);
43: return tv;
44: }
45:
46: private Context mContext;
47: }
48:
49: private String[] mStrings = { "----------""----------""Abbaye de Belloc",
50: "Abbaye du Mont des Cats""Abertam""----------""Abondance",
51: "----------""Ackawi""Acorn""Adelost""Affidelice au Chablis",
52: "Afuega'l Pitu""Airag""----------""Airedale""Aisy Cendre",
53: "----------""Allgauer Emmentaler""Alverca""Ambert",
54: "American Cheese""Ami du Chambertin""----------""----------",
55: "Anejo Enchilado""Anneau du Vic-Bilh""Anthoriro""----------",
56: "----------" };

55.List6 此为ListActivity,在把个List中显示标题,当点击List选项时弹出内容

1

思路:

55.1.

在OnCreate方法里给ListActivity设置了一个Adapter,SpeechListAdapter

1: @Override
2: public void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4:  
5: // Use our own list adapter
6: setListAdapter(new SpeechListAdapter(this));
7: }

55.2

SpeechListAdapter是继承自BaseAdapter,此Adapter由一个mTitles+mDialogue组成,由Boolean 变量mExpanded来控制Adapter是否显示mDialogue的内容,此核心代码如下:

1: /**
2: * Make a SpeechView to hold each row.
3: *
4: @see android.widget.ListAdapter#getView(int, android.view.View,
5: * android.view.ViewGroup)
6: */
7: public View getView(int position, View convertView, ViewGroup parent) {
8: SpeechView sv;
9: if (convertView == null) {
10: sv = new SpeechView(mContextmTitles[position], mDialogue[position],
11: mExpanded[position]);
12: else {
13: sv = (SpeechView) convertView;
14: sv.setTitle(mTitles[position]);
15: sv.setDialogue(mDialogue[position]);
16: sv.setExpanded(mExpanded[position]);
17: }
18:
19: return sv;
20: }
21:
22: public void toggle(int position) {
23: mExpanded[position] = !mExpanded[position];
24: notifyDataSetChanged();//Notifies the attached View that the underlying data has been changed and it should refresh itself.
25: }

55.3 为adapter自定义View

在getView中把postion,convertView传给了一个SpeechView对象,此SpeechView为一个线性布局Linearlayout中有两个子TextView,代码如下

1: private class SpeechView extends LinearLayout {
2: public SpeechView(Context context, String title, String dialogue,
3: boolean expanded) {
4: super(context);
5:  
6: this.setOrientation(VERTICAL);
7:  
8: // Here we build the child views in code. They could also have
9: // been specified in an XML file.
10:
11: mTitle new TextView(context);
12: mTitle.setText(title);
13: addView(mTitlenew LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
14: LayoutParams.WRAP_CONTENT));
15:  
16: mDialogue new TextView(context);
17: mDialogue.setText(dialogue);
18: addView(mDialoguenew LinearLayout.LayoutParams(
19: LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
20:  
21: mDialogue.setVisibility(expanded ? VISIBLE GONE);
22: }
23:  
24: /**
25: * Convenience method to set the title of a SpeechView
26: */
27: public void setTitle(String title) {
28: mTitle.setText(title);
29: }
30:  
31: /**
32: * Convenience method to set the dialogue of a SpeechView
33: */
34: public void setDialogue(String words) {
35: mDialogue.setText(words);
36: }
37:  
38: /**
39: * Convenience method to expand or hide the dialogue
40: */
41: public void setExpanded(boolean expanded) {
42: mDialogue.setVisibility(expanded ? VISIBLE GONE);
43: }
44:  
45: private TextView mTitle;
46: private TextView mDialogue;
47: }

55.4 实现List被单击单件

1: @Override
2: protected void onListItemClick(ListView l, View v, int position, long id) {
3: ((SpeechListAdapter) getListAdapter()).toggle(position);
4: }

它用到了adapter中的一个方法,通知View有更改使其更新

1: public void toggle(int position) {
2: mExpanded[position] = !mExpanded[position];
3: notifyDataSetChanged();//Notifies the attached View that the underlying data has been changed and it should refresh itself.
4: }

56.List8 此例也为ListActivity 。当点击 New photo时,在下面动态的填加图片List

1 

从布局中可以看出在LineraLayout中两个按钮下面是一个FrameLayout,当有内容时显示ListView,当无内容时显示TextView

注意:第34行<ListView android:id="@android:id/list" 表明这个ListView为ListActivity的List

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:orientation="vertical"
5: android:layout_width="fill_parent"
6: android:layout_height="fill_parent">
7:
8: <LinearLayout
9: android:orientation="horizontal"
10: android:layout_width="fill_parent"
11: android:layout_height="wrap_content">
12:
13: <Button android:id="@+id/add"
14: android:layout_width="wrap_content"
15: android:layout_height="wrap_content"
16: android:text="@string/list_8_new_photo"/>
17:
18: <Button android:id="@+id/clear"
19: android:layout_width="wrap_content"
20: android:layout_height="wrap_content"
21: android:text="@string/list_8_clear_photos"/>
22:
23: </LinearLayout>
24:
25: <!-- The frame layout is here since we will be showing either
26: the empty view or the list view. -->
27: <FrameLayout
28: android:layout_width="fill_parent"
29: android:layout_height="0dip"
30: android:layout_weight="1" >
31: <!-- Here is the list. Since we are using a ListActivity, we
32: have to call it "@android:id/list" so ListActivity will
33: find it -->
34: <ListView android:id="@android:id/list"
35: android:layout_width="fill_parent"
36: android:layout_height="fill_parent"
37: android:drawSelectorOnTop="false"/>
38:
39: <!-- Here is the view to show if the list is emtpy -->
40: <TextView android:id="@+id/empty"
41: android:layout_width="fill_parent"
42: android:layout_height="fill_parent"
43: android:text="@string/list_8_no_photos"/>
44:
45: </FrameLayout>
46:
47: </LinearLayout>

在OnCreate里创建了一个PhotoAdaper(自定义类)

1: // Use a custom layout file
2: setContentView(R.layout.list_8);
3:  
4: // Tell the list view which view to display when the list is empty
5: getListView().setEmptyView(findViewById(R.id.empty));//当adapter为空时显示的View
6:
7: // Set up our adapter
8: mAdapter new PhotoAdapter(this);
9: setListAdapter(mAdapter);
10:

PhotoAdaper为继承BaseAdapter的ImageView,即list里显示一个ImageView

1: public View getView(int position, View convertView, ViewGroup parent) {
2: // Make an ImageView to show a photo
3: ImageView i = new ImageView(mContext);
4:  
5: i.setImageResource(mPhotos.get(position));
6: i.setAdjustViewBounds(true);//保持图片比例
7: i.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT,
8: LayoutParams.WRAP_CONTENT));
9: // Give it a nice background
10: i.setBackgroundResource(R.drawable.picture_frame);
11: return i;
12: }

在OnCreate里设置两个按钮事件来填加,清空ImageView

1: // Wire up the clear button to remove all photos
2: Button clear = (Button) findViewById(R.id.clear);
3: clear.setOnClickListener(new View.OnClickListener() {
4:  
5: public void onClick(View v) {
6: mAdapter.clearPhotos();
7: }
8: });
9:  
10: // Wire up the add button to add a new photo
11: Button add = (Button) findViewById(R.id.add);
12: add.setOnClickListener(new View.OnClickListener() {
13:  
14: public void onClick(View v) {
15: mAdapter.addPhotos();
16: }
17: });

在PhotoAdaper里有两个方法用于填加,清空mPhotos,mPhotos为一个ArrayList

1: public void clearPhotos() {
2: mPhotos.clear();
3: notifyDataSetChanged();
4: }
5:
6: public void addPhotos() {
7: int whichPhoto = (int) Math
8: .round(Math.random() * (mPhotoPool.length - 1));
9: int newPhoto = mPhotoPool[whichPhoto];
10: mPhotos.add(newPhoto);
11: notifyDataSetChanged();
12: }

57.list10

1

源码就这些:

1: @Override
2: public void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4:  
5: setListAdapter(new ArrayAdapter<String>(this,
6: android.R.layout.simple_list_item_single_choiceGENRES));
7:  
8: final ListView listView = getListView();
9:  
10: listView.setItemsCanFocus(false);
11: listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);//设置选择行为,此为单选
12: }

58.List11 多选List

1

源码就这些:

注意第8行 final ListView listView = getListView();获得当前List

1: @Override
2: public void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4:  
5: setListAdapter(new ArrayAdapter<String>(this,
6: android.R.layout.simple_list_item_multiple_choiceGENRES));
7:  
8: final ListView listView = getListView();
9:  
10: listView.setItemsCanFocus(false);
11: listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
12: }
13:  

59.List12 

布局由一个List+EditView组成 ,EditView正要输入时可以自动跑到输入法的上面。List里显示EditView输入的内容。并且List从最底部开始显示

1

布局:

注意:第10行android:stackFromBottom="true" android:transcriptMode="normal"

通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:orientation="vertical" android:layout_width="fill_parent"
5: android:layout_height="fill_parent" android:paddingLeft="8dip"
6: android:paddingRight="8dip">
7:
8: <ListView android:id="@android:id/list" android:layout_width="fill_parent"
9: android:layout_height="0dip" android:layout_weight="1"
10: android:stackFromBottom="true" android:transcriptMode="normal" />
11:
12: <EditText android:id="@+id/userText" android:layout_width="fill_parent"
13: android:layout_height="wrap_content" />
14:
15: </LinearLayout>

源码:

注意:第24行mAdapter.add(text);直接在ArrayAdapter里加元素

1: @Override
2: protected void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4:  
5: setContentView(R.layout.list_12);
6:  
7: mAdapter new ArrayAdapter<String>(this,
8: android.R.layout.simple_list_item_1mStrings);
9:  
10: setListAdapter(mAdapter);
11:  
12: mUserText = (EditText) findViewById(R.id.userText);
13:  
14: mUserText.setOnClickListener(this);
15: mUserText.setOnKeyListener(this);
16: }
17:  
18: public void onClick(View v) {
19: sendText();
20: }
21:  
22: private void sendText() {
23: String text = mUserText.getText().toString();
24: mAdapter.add(text);
25: mUserText.setText(null);
26: }
27:  
28: public boolean onKey(View v, int keyCode, KeyEvent event) {
29: if (event.getAction() == KeyEvent.ACTION_DOWN) {
30: switch (keyCode) {
31: case KeyEvent.KEYCODE_DPAD_CENTER:
32: case KeyEvent.KEYCODE_ENTER:
33: sendText();
34: return true;
35: }
36: }
37: return false;
38: }

59.List14

1

在OnCreate里给ListActivity设置了一个自定义的Adapter

1: @Override
2: public void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4: setListAdapter(new EfficientAdapter(this));
5: }

EfficiectAdapter的构造里直接从ListActivity获得一个布局LayoutInflater,

注意:第3行mInflater = LayoutInflater.from(context);

1: public EfficientAdapter(Context context) {
2: // Cache the LayoutInflate to avoid asking for a new one each time.
3: mInflater = LayoutInflater.from(context);
4:  
5: // Icons bound to the rows.
6: mIcon1 BitmapFactory.decodeResource(context.getResources(),
7: R.drawable.icon48x48_1);
8: mIcon2 = BitmapFactory.decodeResource(context.getResources(),
9: R.drawable.icon48x48_2);
10: }

创建了一个用去存View的类ViewHolder,

1: static class ViewHolder {
2: TextView text;
3: ImageView icon;
4: }

在EfficiectAdapter的getView

注意:第13行convertView = mInflater.inflate(R.layout.list_item_icon_textnull);直接把convertView 的布局设置成

R.layout.list_item_icon_text

convertView 为要显示在Adapter中的View

1: public View getView(int position, View convertView, ViewGroup parent) {
2: // A ViewHolder keeps references to children views to avoid unneccessary
3: // calls
4: // to findViewById() on each row.
5: ViewHolder holder;
6:  
7: // When convertView is not null, we can reuse it directly, there is no
8: // need
9: // to reinflate it. We only inflate a new View when the convertView
10: // supplied
11: // by ListView is null.
12: if (convertView == null) {
13: convertView = mInflater.inflate(R.layout.list_item_icon_textnull);
14:  
15: // Creates a ViewHolder and store references to the two children views
16: // we want to bind data to.
17: holder = new ViewHolder();
18: holder.text = (TextView) convertView.findViewById(R.id.text);
19: holder.icon = (ImageView) convertView.findViewById(R.id.icon);
20:  
21: convertView.setTag(holder);
22: else {
23: // Get the ViewHolder back to get fast access to the TextView
24: // and the ImageView.
25: holder = (ViewHolder) convertView.getTag();
26: }
27:  
28: // Bind the data efficiently with the holder.
29: holder.text.setText(DATA[position]);
30: holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 mIcon2);
31:  
32: return convertView;
33: }

60.ProgressBar1 进度条

1

Layout布局中ProgressBar部分:

第2行是ProgressBar的style样式,第5行为ProgressBar的最大值,第6行为默认ProgressBar的初始值,第7行为第二个ProgressBar的初始值

PorgressBar的style为style="?android:attr/progressBarStyleHorizontal"

1: <ProgressBar android:id="@+id/progress_horizontal"
2: style="?android:attr/progressBarStyleHorizontal"
3: android:layout_width="200dip"
4: android:layout_height="wrap_content"
5: android:max="100"
6: android:progress="50"
7: android:secondaryProgress="75" />

此程序在标题栏上显示了ProgressBar,代码如下:

第7,8行一定要乘与100,因为// Title progress is in range 0..10000,即标题拦的进度在0到10000之间

1: // Request the progress bar to be shown in the title
2: requestWindowFeature(Window.FEATURE_PROGRESS);
3: setContentView(R.layout.progressbar_1);
4: setProgressBarVisibility(true);
5:  
6: final ProgressBar progressHorizontal = (ProgressBar) findViewById(R.id.progress_horizontal);
7: setProgress(progressHorizontal.getProgress()*100);//无这两句标题拦里不显示进度条ProgressBar,一条要乘与100
8: setSecondaryProgress(progressHorizontal.getSecondaryProgress() *100);

加减进度条进度值的方法:

注意:progressHorizontal.incrementSecondaryProgressBy(-1); 正数为加,负数为减

1: Button button = (Button) findViewById(R.id.increase);
2: button.setOnClickListener(new Button.OnClickListener() {
3: public void onClick(View v) {
4: progressHorizontal.incrementProgressBy(1);
5: // Title progress is in range 0..10000
6: setProgress(100 * progressHorizontal.getProgress());
7: }
8: });
1: button = (Button) findViewById(R.id.decrease_secondary);
2: button.setOnClickListener(new Button.OnClickListener() {
3: public void onClick(View v) {
4: progressHorizontal.incrementSecondaryProgressBy(-1);
5: // Title progress is in range 0..10000
6: setSecondaryProgress(100 * progressHorizontal
7: .getSecondaryProgress());
8: }
9: });

61.ProgressBar2 进度条

1

上面显示了4个ProgressBar ,布局为:

注意:style="?android:attr/progressBarStyleLarge" style="?android:attr/progressBarStyleSmall"  style="?android:attr/progressBarStyleSmallTitle"

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:orientation="vertical"
5: android:layout_width="fill_parent"
6: android:layout_height="wrap_content">
7:
8: <ProgressBar android:id="@+android:id/progress_large"
9: style="?android:attr/progressBarStyleLarge"
10: android:layout_width="wrap_content"
11: android:layout_height="wrap_content" />
12:
13: <ProgressBar android:id="@+android:id/progress"
14: android:layout_width="wrap_content"
15: android:layout_height="wrap_content" />
16:
17: <ProgressBar android:id="@+android:id/progress_small"
18: style="?android:attr/progressBarStyleSmall"
19: android:layout_width="wrap_content"
20: android:layout_height="wrap_content" />
21:
22: <ProgressBar android:id="@+android:id/progress_small_title"
23: style="?android:attr/progressBarStyleSmallTitle"
24: android:layout_width="wrap_content"
25: android:layout_height="wrap_content" />
26:
27: </LinearLayout>
28:

最后在OnCreate里

1: // Request for the progress bar to be shown in the title
2: requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
3:  
4: setContentView(R.layout.progressbar_2);
5:  
6: // Make sure the progress bar is visible
7: setProgressBarVisibility(true);

62. ProgressBar3

1

此程序为两个按钮,上面的激活带标题的ProgressDialog  ,下面激活不带标题的ProgressDialog

OnCreate方法:

1: private static final int DIALOG1_KEY = 0;
2: private static final int DIALOG2_KEY = 1;
3:  
4: @Override
5: protected void onCreate(Bundle savedInstanceState) {
6: super.onCreate(savedInstanceState);
7:  
8: setContentView(R.layout.progressbar_3);
9:  
10: Button button = (Button) findViewById(R.id.showIndeterminate);
11: button.setOnClickListener(new View.OnClickListener() {
12: public void onClick(View v) {
13: showDialog(DIALOG1_KEY);
14: }
15: });
16:  
17: button = (Button) findViewById(R.id.showIndeterminateNoTitle);
18: button.setOnClickListener(new View.OnClickListener() {
19: public void onClick(View v) {
20: showDialog(DIALOG2_KEY);
21: }
22: });
23: }

由showDialog(DIALOG2_KEY) 激活对话框的方法:

1: @Override
2: protected Dialog onCreateDialog(int id) {
3: switch (id) {
4: case DIALOG1_KEY: {
5: ProgressDialog dialog = new ProgressDialog(this);
6: dialog.setTitle("Indeterminate");
7: dialog.setMessage("Please wait while loading...");
8: dialog.setIndeterminate(true);
9: dialog.setCancelable(true);
10: return dialog;
11: }
12: case DIALOG2_KEY: {
13: ProgressDialog dialog = new ProgressDialog(this);
14: dialog.setMessage("Please wait while loading...");
15: dialog.setIndeterminate(true);
16: dialog.setCancelable(true);
17: return dialog;
18: }
19: }
20: return null;
21: }

63.ProgressBar4  在标题栏显示进度条(右上角)

1

源码:

1: private boolean mToggleIndeterminate false;
2:  
3: @Override
4: protected void onCreate(Bundle savedInstanceState) {
5: super.onCreate(savedInstanceState);
6:  
7: // Request progress bar
8: requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);//一定要有
9: setContentView(R.layout.progressbar_4);
10: setProgressBarIndeterminateVisibility(mToggleIndeterminate);//Whether to show the progress bars in the title
11:
12: Button button = (Button) findViewById(R.id.toggle);
13: button.setOnClickListener(new Button.OnClickListener() {
14: public void onClick(View v) {
15: mToggleIndeterminate = !mToggleIndeterminate;
16: setProgressBarIndeterminateVisibility(mToggleIndeterminate);
17: }
18: });
19: }

64.RadioGroup1

1

布局:一个RadioGroup里有4个RadioButton,默认被选定的是android:checkedButton="@+id/lunch"

1: <?xml version="1.0" encoding="utf-8"?>
2:
3:
4: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
5: android:layout_width="fill_parent"
6: android:layout_height="fill_parent"
7: android:orientation="vertical">
8: <RadioGroup
9: android:layout_width="fill_parent"
10: android:layout_height="wrap_content"
11: android:orientation="vertical"
12: android:checkedButton="@+id/lunch"
13: android:id="@+id/menu">
14: <RadioButton
15: android:text="@string/radio_group_1_breakfast"
16: android:id="@+id/breakfast"
17: />
18: <RadioButton
19: android:text="@string/radio_group_1_lunch"
20: android:id="@id/lunch" />
21: <RadioButton
22: android:text="@string/radio_group_1_dinner"
23: android:id="@+id/dinner" />
24: <RadioButton
25: android:text="@string/radio_group_1_all"
26: android:id="@+id/all" />
27: <TextView
28: android:text="@string/radio_group_1_selection"
29: android:id="@+id/choice" />
30: </RadioGroup>
31: <Button
32: android:layout_width="wrap_content"
33: android:layout_height="wrap_content"
34: android:text="@string/radio_group_1_clear"
35: android:id="@+id/clear" />
36: </LinearLayout>

源码:

在第9行到15行动态往RadioGroup里addView加入了一个RadioButton,

第19行设置选择改变setOnCheckedChangeListener(this),在第28行实现了onCheckedChanged方法

1: @Override
2: protected void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4:  
5: setContentView(R.layout.radio_group_1);
6: mRadioGroup = (RadioGroup) findViewById(R.id.menu);
7:  
8: // test adding a radio button programmatically
9: RadioButton newRadioButton = new RadioButton(this);
10: newRadioButton.setText(R.string.radio_group_snack);
11: newRadioButton.setId(R.id.snack);
12: LinearLayout.LayoutParams layoutParams = new RadioGroup.LayoutParams(
13: RadioGroup.LayoutParams.WRAP_CONTENT,
14: RadioGroup.LayoutParams.WRAP_CONTENT);
15: mRadioGroup.addView(newRadioButton, 0, layoutParams);
16:  
17: // test listening to checked change events
18: String selection = getString(R.string.radio_group_selection);
19: mRadioGroup.setOnCheckedChangeListener(this);
20: mChoice = (TextView) findViewById(R.id.choice);
21: mChoice.setText(selection + mRadioGroup.getCheckedRadioButtonId());
22:  
23: // test clearing the selection
24: Button clearButton = (Button) findViewById(R.id.clear);
25: clearButton.setOnClickListener(this);
26: }
27:  
28: public void onCheckedChanged(RadioGroup group, int checkedId) {
29: String selection = getString(R.string.radio_group_selection);
30: String none = getString(R.string.radio_group_none);
31: mChoice.setText(selection
32: + (checkedId == View.NO_ID ? none : checkedId));
33: }
34:
35: public void onClick(View v) {
36: mRadioGroup.clearCheck();
37: }

65.

1

布局:

注意:第12行,18行的android:numStars="3"星数 第13行,19行的android:rating="2.5" 默认初始值

第31行,40行的样式 style="?android:attr/ratingBarStyleSmall"   style="?android:attr/ratingBarStyleIndicator"

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:orientation="vertical"
5: android:paddingLeft="10dip"
6: android:layout_width="fill_parent"
7: android:layout_height="fill_parent">
8:
9: <RatingBar android:id="@+id/ratingbar1"
10: android:layout_width="wrap_content"
11: android:layout_height="wrap_content"
12: android:numStars="3"
13: android:rating="2.5" />
14:
15: <RatingBar android:id="@+id/ratingbar2"
16: android:layout_width="wrap_content"
17: android:layout_height="wrap_content"
18: android:numStars="5"
19: android:rating="2.25" />
20:
21: <LinearLayout
22: android:layout_width="fill_parent"
23: android:layout_height="wrap_content"
24: android:layout_marginTop="10dip">
25:
26: <TextView android:id="@+id/rating"
27: android:layout_width="wrap_content"
28: android:layout_height="wrap_content" />
29:
30: <RatingBar android:id="@+id/small_ratingbar"
31: style="?android:attr/ratingBarStyleSmall"
32: android:layout_marginLeft="5dip"
33: android:layout_width="wrap_content"
34: android:layout_height="wrap_content"
35: android:layout_gravity="center_vertical" />
36:
37: </LinearLayout>
38:
39: <RatingBar android:id="@+id/indicator_ratingbar"
40: style="?android:attr/ratingBarStyleIndicator"
41: android:layout_marginLeft="5dip"
42: android:layout_width="wrap_content"
43: android:layout_height="wrap_content"
44: android:layout_gravity="center_vertical" />
45:
46: </LinearLayout>
47:

mIndicatorRatingBar mSmallRatingBar两个变量为image 这两个RatingBar

1: // We copy the most recently changed rating on to these indicator-only
2: // rating bars
3: mIndicatorRatingBar = (RatingBar) findViewById(R.id.indicator_ratingbar);
4: mSmallRatingBar = (RatingBar) findViewById(R.id.small_ratingbar);
5:
6: // The different rating bars in the layout. Assign the listener to us.
7: ((RatingBar) findViewById(R.id.ratingbar1))
8: .setOnRatingBarChangeListener(this);
9: ((RatingBar) findViewById(R.id.ratingbar2))
10: .setOnRatingBarChangeListener(this);

第7到第10行setOnRatingBarChangeListener(this);方法内来改变

1: public void onRatingChanged(RatingBar ratingBar, float rating,
2: boolean fromTouch) {
3: final int numStars = ratingBar.getNumStars();
4: mRatingText.setText(getString(R.string.ratingbar_rating) + " " + rating
5: "/" + numStars);
6:  
7: // Since this rating bar is updated to reflect any of the other rating
8: // bars, we should update it to the current values.
9: if (mIndicatorRatingBar.getNumStars() != numStars) {
10: mIndicatorRatingBar.setNumStars(numStars);
11: mSmallRatingBar.setNumStars(numStars);
12: }
13: if (mIndicatorRatingBar.getRating() != rating) {
14: mIndicatorRatingBar.setRating(rating);
15: mSmallRatingBar.setRating(rating);
16: }
17: final float ratingBarStepSize = ratingBar.getStepSize();
18: if (mIndicatorRatingBar.getStepSize() != ratingBarStepSize) {
19: mIndicatorRatingBar.setStepSize(ratingBarStepSize);
20: mSmallRatingBar.setStepSize(ratingBarStepSize);
21: }
22: }

当ratingBar为三个星时,image

当ratingBar为五个星时,image

66.ScrollBar1

1

它就在布局XML文件里的ScrollView里加入了N个TextView

1: <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
2: android:layout_width="fill_parent"
3: android:layout_height="wrap_content">
4:
5: <LinearLayout
6: android:orientation="vertical"
7: android:layout_width="fill_parent"
8: android:layout_height="wrap_content">
9:
10: <TextView
11: android:layout_width="fill_parent"
12: android:layout_height="wrap_content"
13: android:text="@string/scrollbar_1_text"/>
14: <TextView
15: android:layout_width="fill_parent"
16: android:layout_height="wrap_content"
17: android:text="@string/scrollbar_1_text"/>
18: <TextView
19: android:layout_width="fill_parent"
20: android:layout_height="wrap_content"
21: android:text="@string/scrollbar_1_text"/>

67.ScrollBar2

1

和上面的例子就差在颜色上,

注意第4.5行的android:scrollbarTrackVertical="@drawable/scrollbar_vertical_track"android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"

1: <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
2: android:layout_width="fill_parent"
3: android:layout_height="wrap_content"
4: android:scrollbarTrackVertical="@drawable/scrollbar_vertical_track"
5: android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"
6: android:scrollbarSize="12dip">
7:
8: <LinearLayout
9: android:orientation="vertical"
10: android:layout_width="fill_parent"
11: android:layout_height="wrap_content">
12:
13: <TextView
14: android:layout_width="fill_parent"
15: android:layout_height="wrap_content"
16: android:text="@string/scrollbar_2_text"/>
17: <TextView
18: android:layout_width="fill_parent"
19: android:layout_height="wrap_content"
20: android:text="@string/scrollbar_2_text"/>

scrollbar_vertical_track.xml

1: <?xml version="1.0" encoding="utf-8"?>
2:
3:
4: <shape xmlns:android="http://schemas.android.com/apk/res/android">
5: <gradient android:startColor="#505050" android:endColor="#C0C0C0"
6: android:angle="0"/>
7: <corners android:radius="0dp" />
8: </shape>
9:

scrollbar_vertical_thumb.xml

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <shape xmlns:android="http://schemas.android.com/apk/res/android">
4: <gradient android:startColor="#3333FF" android:endColor="#8080FF"
5: android:angle="0"/>
6: <corners android:radius="6dp" />
7: </shape>
8:

68.ScrollBar3

1

第4行设置style image

1:  
2: setContentView(R.layout.scrollbar3);
3:  
4: findViewById(R.id.view3).setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);

布局:

注意:第114行的style image android:scrollbarStyle="outsideInset"

1: <?xml version="1.0" encoding="utf-8"?>
2:
3:
4: <!-- Demonstrates scrolling with a ScrollView. -->
5:
6: <LinearLayout
7: xmlns:android="http://schemas.android.com/apk/res/android"
8: android:layout_width="fill_parent"
9: android:layout_height="fill_parent"
10: android:orientation="vertical">
11:
12: <LinearLayout
13: android:layout_width="fill_parent"
14: android:layout_height="wrap_content"
15: android:orientation="horizontal">
16:
17: <ScrollView
18: android:layout_width="100dip"
19: android:layout_height="120dip"
20: android:background="#FF0000">
21: <LinearLayout
22: android:orientation="vertical"
23: android:layout_width="fill_parent"
24: android:layout_height="fill_parent">
25:
26: <TextView
27: android:layout_width="fill_parent"
28: android:layout_height="wrap_content"
29: android:text="@string/scrollbar_2_text" />
30: <TextView
31: android:layout_width="fill_parent"
32: android:layout_height="wrap_content"
33: android:text="@string/scrollbar_2_text" />
34: <TextView
35: android:layout_width="fill_parent"
36: android:layout_height="wrap_content"
37: android:text="@string/scrollbar_2_text" />
38: <TextView
39: android:layout_width="fill_parent"
40: android:layout_height="wrap_content"
41: android:text="@string/scrollbar_2_text" />
42: <TextView
43: android:layout_width="fill_parent"
44: android:layout_height="wrap_content"
45: android:text="@string/scrollbar_2_text" />
46: <TextView
47: android:layout_width="fill_parent"
48: android:layout_height="wrap_content"
49: android:text="@string/scrollbar_2_text" />
50: <TextView
51: android:layout_width="fill_parent"
52: android:layout_height="wrap_content"
53: android:text="@string/scrollbar_2_text" />
54: <TextView
55: android:layout_width="fill_parent"
56: android:layout_height="wrap_content"
57: android:text="@string/scrollbar_2_text" />
58: <TextView
59: android:layout_width="fill_parent"
60: android:layout_height="wrap_content"
61: android:text="@string/scrollbar_2_text" />
62: <TextView
63: android:layout_width="fill_parent"
64: android:layout_height="wrap_content"
65: android:text="@string/scrollbar_2_text" />
66: </LinearLayout>
67: </ScrollView>
68:
69: <ScrollView
70: android:layout_width="100dip"
71: android:layout_height="120dip"
72: android:background="#00FF00"
73: android:paddingRight="12dip">
74: <TextView
75: android:layout_width="fill_parent"
76: android:layout_height="wrap_content"
77: android:text="@string/scrollbar_3_text"
78: android:textColor="#000000"
79: android:background="#60AA60" />
80: </ScrollView>
81:
82: <ScrollView
83: android:id="@+id/view3"
84: android:layout_width="100dip"
85: android:layout_height="120dip"
86: android:background="@android:drawable/edit_text">
87: <TextView
88: android:layout_width="fill_parent"
89: android:layout_height="wrap_content"
90: android:textColor="#000000"
91: android:text="@string/scrollbar_3_text" />
92: </ScrollView>
93: </LinearLayout>
94:
95: <LinearLayout
96: android:layout_width="fill_parent"
97: android:layout_height="wrap_content">
98: <ScrollView
99: android:id="@+id/view4"
100: android:layout_width="100dip"
101: android:layout_height="120dip"
102: android:scrollbarStyle="outsideOverlay"
103: android:background="@android:drawable/edit_text">
104: <TextView
105: android:layout_width="fill_parent"
106: android:layout_height="wrap_content"
107: android:textColor="#000000"
108: android:text="@string/scrollbar_3_text" />
109: </ScrollView>
110: <ScrollView
111: android:id="@+id/view5"
112: android:layout_width="100dip"
113: android:layout_height="120dip"
114: android:scrollbarStyle="outsideInset"
115: android:background="@android:drawable/edit_text">
116: <TextView
117: android:layout_width="fill_parent"
118: android:layout_height="wrap_content"
119: android:textColor="#000000"
120: android:text="@string/scrollbar_3_text" />
121: </ScrollView>
122: </LinearLayout>
123: </LinearLayout>
124:

69.SeekBar1

1

布局:

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:orientation="vertical"
5: android:layout_width="fill_parent"
6: android:layout_height="fill_parent">
7:
8: <SeekBar android:id="@+id/seek"
9: android:layout_width="fill_parent"
10: android:layout_height="wrap_content"
11: android:max="100"
12: android:progress="50"
13: android:secondaryProgress="75" />
14:
15: <TextView android:id="@+id/progress"
16: android:layout_width="fill_parent"
17: android:layout_height="wrap_content" />
18:
19: <TextView android:id="@+id/tracking"
20: android:layout_width="fill_parent"
21: android:layout_height="wrap_content" />
22: </LinearLayout>

源码:

1: SeekBar mSeekBar;
2: TextView mProgressText;
3: TextView mTrackingText;
4:  
5: @Override
6: protected void onCreate(Bundle savedInstanceState) {
7: super.onCreate(savedInstanceState);
8:  
9: setContentView(R.layout.seekbar_1);
10:  
11: mSeekBar = (SeekBar) findViewById(R.id.seek);
12: mSeekBar.setOnSeekBarChangeListener(this);
13: mProgressText = (TextView) findViewById(R.id.progress);
14: mTrackingText = (TextView) findViewById(R.id.tracking);
15: }
16:  
17: public void onProgressChanged(SeekBar seekBar, int progress,
18: boolean fromTouch) {
19: mProgressText.setText(progress + " "
20: + getString(R.string.seekbar_from_touch) + "=" fromTouch);
21: }
22:
23: public void onStartTrackingTouch(SeekBar seekBar) {
24: mTrackingText.setText(getString(R.string.seekbar_tracking_on));
25: }
26:
27: public void onStopTrackingTouch(SeekBar seekBar) {
28: mTrackingText.setText(getString(R.string.seekbar_tracking_off));
29: }

70.Spinner1

1 1

注意:源码第7行ArrayAdapter用R.array.colors数组来设置

1: @Override
2: public void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4: setContentView(R.layout.spinner_1);
5:  
6: Spinner s1 = (Spinner) findViewById(R.id.spinner1);
7: ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
8: this, R.array.colors, android.R.layout.simple_spinner_item);
9: adapter
10: .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
11: s1.setAdapter(adapter);
12:  
13: Spinner s2 = (Spinner) findViewById(R.id.spinner2);
14: adapter = ArrayAdapter.createFromResource(this, R.array.planets,
15: android.R.layout.simple_spinner_item);
16: adapter
17: .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
18: s2.setAdapter(adapter);
19: }

布局:

android:prompt="@string/spinner_1_color_prompt"为提示,image

1: <Spinner android:id="@+id/spinner1"
2: android:layout_width="fill_parent"
3: android:layout_height="wrap_content"
4: android:drawSelectorOnTop="true"
5: android:prompt="@string/spinner_1_color_prompt"
6: />

71.Tabs1

2

源码:第15行继承TabActivity

1: import android.app.TabActivity;
2: import android.os.Bundle;
3: import android.widget.TabHost;
4: import android.widget.TabHost.TabSpec;
5: import android.view.LayoutInflater;
6: import android.view.View;
7:  
8: import com.example.android.apis.R;
9:  
10: /**
11: * An example of tabs that uses labels (
12: {@link TabSpec#setIndicator(CharSequence)}) for its indicators and views by
13: * id from a layout file ({@link TabSpec#setContent(int)}).
14: */
15: public class Tabs1 extends TabActivity {
16:  
17: @Override
18: protected void onCreate(Bundle savedInstanceState) {
19: super.onCreate(savedInstanceState);
20: TabHost tabHost = getTabHost();
21:
22: LayoutInflater.from(this).inflate(R.layout.tabs1,
23: tabHost.getTabContentView(), true);
24:
25: tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("tab1")
26: .setContent(R.id.view1));
27: tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab2")
28: .setContent(R.id.view2));
29: tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab3")
30: .setContent(R.id.view3));
31: }
32: }

布局:第22行的tabs1.xml

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:layout_width="fill_parent"
5: android:layout_height="fill_parent">
6:
7: <TextView android:id="@+id/view1"
8: android:background="@drawable/blue"
9: android:layout_width="fill_parent"
10: android:layout_height="fill_parent"
11: android:text="@string/tabs_1_tab_1"/>
12:
13: <TextView android:id="@+id/view2"
14: android:background="@drawable/red"
15: android:layout_width="fill_parent"
16: android:layout_height="fill_parent"
17: android:text="@string/tabs_1_tab_2"/>
18:
19: <TextView android:id="@+id/view3"
20: android:background="@drawable/green"
21: android:layout_width="fill_parent"
22: android:layout_height="fill_parent"
23: android:text="@string/tabs_1_tab_3"/>
24:
25: </FrameLayout>
26:

72.Tabs2

1

源码:

1: import android.app.TabActivity;
2: import android.os.Bundle;
3: import android.widget.TabHost;
4: import android.widget.TextView;
5: import android.view.View;
6: import com.example.android.apis.R;
7:  
8: /**
9: * Example of using a tab content factory for the content via
10: {@link TabHost.TabSpec#setContent(android.widget.TabHost.TabContentFactory)}
11: *
12: * It also demonstrates using an icon on one of the tabs via
13: {@link TabHost.TabSpec#setIndicator(CharSequence, android.graphics.drawable.Drawable)}
14: *
15: */
16: public class Tabs2 extends TabActivity implements TabHost.TabContentFactory {
17:  
18: @Override
19: protected void onCreate(Bundle savedInstanceState) {
20: super.onCreate(savedInstanceState);
21:  
22: final TabHost tabHost = getTabHost();
23: tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("tab1",
24: getResources().getDrawable(R.drawable.star_big_on)).setContent(
25: this));
26: tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("tab2")
27: .setContent(this));
28: tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab3")
29: .setContent(this));
30: }
31:  
32: /** {@inheritDoc} */
33: public View createTabContent(String tag) {
34: final TextView tv = new TextView(this);
35: tv.setText("Content for tab with tag " + tag);
36: return tv;
37: }
38: }

73.Tabs3: 三个Tab布局不一样

1 2 3

源码:

1: import android.app.TabActivity;
2: import android.os.Bundle;
3: import android.widget.TabHost;
4: import android.content.Intent;
5:  
6: /**
7: * An example of tab content that launches an activity via
8: {@link android.widget.TabHost.TabSpec#setContent(android.content.Intent)}
9: */
10: public class Tabs3 extends TabActivity {
11:  
12: @Override
13: protected void onCreate(Bundle savedInstanceState) {
14: super.onCreate(savedInstanceState);
15:  
16: final TabHost tabHost = getTabHost();
17:  
18: tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("list")
19: .setContent(new Intent(this, List1.class)));
20:  
21: tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("photo list")
22: .setContent(new Intent(this, List8.class)));
23:  
24: // This tab sets the intent flag so that it is recreated each time
25: // the tab is clicked.
26: tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("destroy")
27: .setContent(
28: new Intent(this, Controls2.class)
29: .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));
30: }
31: }

74.TextSwitcher1  点击按钮TextSwitcher会加1

1

布局:

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4: android:layout_width="fill_parent"
5: android:layout_height="fill_parent"
6: android:orientation="vertical">
7:
8: <Button android:id="@+id/next"
9: android:layout_width="wrap_content"
10: android:layout_height="wrap_content"
11: android:text="@string/text_switcher_1_next_text" />
12:
13: <TextSwitcher android:id="@+id/switcher"
14: android:layout_width="fill_parent"
15: android:layout_height="wrap_content" />
16:
17: </LinearLayout>
18:

源码:

1: import com.example.android.apis.R;
2:  
3: import android.app.Activity;
4: import android.os.Bundle;
5: import android.view.Gravity;
6: import android.view.View;
7: import android.view.animation.Animation;
8: import android.view.animation.AnimationUtils;
9: import android.widget.Button;
10: import android.widget.TextSwitcher;
11: import android.widget.TextView;
12: import android.widget.ViewSwitcher;
13:  
14: /**
15: * Uses a TextSwitcher.
16: */
17: public class TextSwitcher1 extends Activity implements
18: ViewSwitcher.ViewFactory, View.OnClickListener {
19:  
20: private TextSwitcher mSwitcher;
21:
22: private int mCounter = 0;
23:
24: @Override
25: protected void onCreate(Bundle savedInstanceState) {
26: super.onCreate(savedInstanceState);
27:
28: setContentView(R.layout.text_switcher_1);
29:
30: mSwitcher = (TextSwitcher) findViewById(R.id.switcher);
31: mSwitcher.setFactory(this);
32:
33: Animation in = AnimationUtils.loadAnimation(this,
34: android.R.anim.fade_in);
35: Animation out = AnimationUtils.loadAnimation(this,
36: android.R.anim.fade_out);
37: mSwitcher.setInAnimation(in);
38: mSwitcher.setOutAnimation(out);
39:
40: Button nextButton = (Button) findViewById(R.id.next);
41: nextButton.setOnClickListener(this);
42:
43: updateCounter();
44: }
45:
46: public void onClick(View v) {
47: mCounter++;
48: updateCounter();
49: }
50:
51: private void updateCounter() {
52: mSwitcher.setText(String.valueOf(mCounter));
53: }
54:
55: public View makeView() {
56: TextView t = new TextView(this);
57: t.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
58: t.setTextSize(36);
59: return t;
60: }
61: }

75.Visibility1

1

布局:

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!-- Demonstrates changing view visibility. See corresponding Java code. -->
4:
5: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
6: android:orientation="vertical"
7: android:layout_width="fill_parent"
8: android:layout_height="fill_parent">
9:
10: <LinearLayout
11: android:orientation="vertical"
12: android:background="@drawable/box"
13: android:layout_width="fill_parent"
14: android:layout_height="wrap_content">
15:
16: <TextView
17: android:background="@drawable/red"
18: android:layout_width="fill_parent"
19: android:layout_height="wrap_content"
20: android:text="@string/visibility_1_view_1"/>
21:
22: <TextView android:id="@+id/victim"
23: android:background="@drawable/green"
24: android:layout_width="fill_parent"
25: android:layout_height="wrap_content"
26: android:text="@string/visibility_1_view_2"/>
27:
28: <TextView
29: android:background="@drawable/blue"
30: android:layout_width="fill_parent"
31: android:layout_height="wrap_content"
32: android:text="@string/visibility_1_view_3"/>
33:
34: </LinearLayout>
35:
36: <LinearLayout
37: android:orientation="horizontal"
38: android:layout_width="wrap_content"
39: android:layout_height="wrap_content">
40:
41: <Button android:id="@+id/vis"
42: android:layout_width="wrap_content"
43: android:layout_height="wrap_content"
44: android:text="@string/visibility_1_vis"/>
45:
46: <Button android:id="@+id/invis"
47: android:layout_width="wrap_content"
48: android:layout_height="wrap_content"
49: android:text="@string/visibility_1_invis"/>
50:
51: <Button android:id="@+id/gone"
52: android:layout_width="wrap_content"
53: android:layout_height="wrap_content"
54: android:text="@string/visibility_1_gone"/>
55:
56: </LinearLayout>
57: </LinearLayout>
58:

源码:

1: import android.app.Activity;
2: import android.os.Bundle;
3: import android.view.View;
4: import android.view.View.OnClickListener;
5: import android.widget.Button;
6:  
7: /**
8: * Demonstrates making a view VISIBLE, INVISIBLE and GONE
9: *
10: */
11: public class Visibility1 extends Activity {
12:  
13: private View mVictim;
14:  
15: @Override
16: protected void onCreate(Bundle savedInstanceState) {
17: super.onCreate(savedInstanceState);
18: setContentView(R.layout.visibility_1);
19:  
20: // Find the view whose visibility will change
21: mVictim = findViewById(R.id.victim);
22:  
23: // Find our buttons
24: Button visibleButton = (Button) findViewById(R.id.vis);
25: Button invisibleButton = (Button) findViewById(R.id.invis);
26: Button goneButton = (Button) findViewById(R.id.gone);
27:  
28: // Wire each button to a click listener
29: visibleButton.setOnClickListener(mVisibleListener);
30: invisibleButton.setOnClickListener(mInvisibleListener);
31: goneButton.setOnClickListener(mGoneListener);
32: }
33:  
34: OnClickListener mVisibleListener new OnClickListener() {
35: public void onClick(View v) {
36: mVictim.setVisibility(View.VISIBLE);
37: }
38: };
39:  
40: OnClickListener mInvisibleListener new OnClickListener() {
41: public void onClick(View v) {
42: mVictim.setVisibility(View.INVISIBLE);
43: }
44: };
45:  
46: OnClickListener mGoneListener new OnClickListener() {
47: public void onClick(View v) {
48: mVictim.setVisibility(View.GONE);
49: }
50: };
51: }

76.WebView1

1

布局:10个WebView

1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
4: android:layout_width="fill_parent"
5: android:layout_height="wrap_content"
6: android:orientation="vertical">
7:
8:
9: <LinearLayout
10: android:orientation="vertical"
11: android:layout_width="fill_parent"
12: android:layout_height="wrap_content">
13:
14: <WebView android:id="@+id/wv1"
15: android:layout_height="wrap_content"
16: android:layout_width="fill_parent"
17: />
18:
19: <WebView android:id="@+id/wv2"
20: android:layout_height="wrap_content"
21: android:layout_width="fill_parent"
22: />
23:
24: <WebView android:id="@+id/wv3"
25: android:layout_height="wrap_content"
26: android:layout_width="fill_parent"
27: />
28:
29: <WebView android:id="@+id/wv4"
30: android:layout_height="wrap_content"
31: android:layout_width="fill_parent"
32: />
33:
34: <WebView android:id="@+id/wv5"
35: android:layout_height="wrap_content"
36: android:layout_width="fill_parent"
37: />
38:
39: <WebView android:id="@+id/wv6"
40: android:layout_height="wrap_content"
41: android:layout_width="fill_parent"
42: />
43:
44: <WebView android:id="@+id/wv7"
45: android:layout_height="wrap_content"
46: android:layout_width="fill_parent"
47: />
48:
49: <WebView android:id="@+id/wv8"
50: android:layout_height="wrap_content"
51: android:layout_width="fill_parent"
52: />
53:
54: <WebView android:id="@+id/wv9"
55: android:layout_height="wrap_content"
56: android:layout_width="fill_parent"
57: />
58:
59: <WebView android:id="@+id/wv10"
60: android:layout_height="wrap_content"
61: android:layout_width="fill_parent"
62: />
63: </LinearLayout>
64:
65: </ScrollView>
66:

源码:

1: import android.app.Activity;
2: import android.os.Bundle;
3: import android.webkit.WebView;
4:  
5: import com.example.android.apis.R;
6:  
7:  
8: /**
9: * Sample creating 10 webviews.
10: */
11: public class WebView1 extends Activity {
12:  
13: @Override
14: public void onCreate(Bundle icicle) {
15: super.onCreate(icicle);
16:  
17: setContentView(R.layout.webview_1);
18:  
19: final String mimeType = "text/html";
20: final String encoding = "utf-8";
21:  
22: WebView wv;
23:  
24: wv = (WebView) findViewById(R.id.wv1);
25: wv.loadData("<a href='x'>Hello World! - 1</a>", mimeType, encoding);
26:
27: wv = (WebView) findViewById(R.id.wv2);
28: wv.loadData("<a href='x'>Hello World! - 2</a>", mimeType, encoding);
29:
30: wv = (WebView) findViewById(R.id.wv3);
31: wv.loadData("<a href='x'>Hello World! - 3</a>", mimeType, encoding);
32:
33: wv = (WebView) findViewById(R.id.wv4);
34: wv.loadData("<a href='x'>Hello World! - 4</a>", mimeType, encoding);
35:
36: wv = (WebView) findViewById(R.id.wv5);
37: wv.loadData("<a href='x'>Hello World! - 5</a>", mimeType, encoding);
38:
39: wv = (WebView) findViewById(R.id.wv6);
40: wv.loadData("<a href='x'>Hello World! - 6</a>", mimeType, encoding);
41:
42: wv = (WebView) findViewById(R.id.wv7);
43: wv.loadData("<a href='x'>Hello World! - 7</a>", mimeType, encoding);
44:
45: wv = (WebView) findViewById(R.id.wv8);
46: wv.loadData("<a href='x'>Hello World! - 8</a>", mimeType, encoding);
47:
48: wv = (WebView) findViewById(R.id.wv9);
49: wv.loadData("<a href='x'>Hello World! - 9</a>", mimeType, encoding);
50:
51: wv = (WebView) findViewById(R.id.wv10);
52: wv.loadData("<a href='x'>Hello World! - 10</a>", mimeType, encoding);
53: }
54: }
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值