package com.example.android.apis.graphics;
23.TextAlign:
设置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()方法中:
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,画
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);
1: canvas.drawPath(mPath, mPathPaint);
2: p.setTextAlign(Paint.Align.LEFT);
3: canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p);
4:
5: canvas.translate(0, DY * 1.5f);
6: canvas.drawPath(mPath, mPathPaint);
7: p.setTextAlign(Paint.Align.CENTER);
8: canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p);
9:
10: canvas.translate(0, DY * 1.5f);
11: canvas.drawPath(mPath, mPathPaint);
12: p.setTextAlign(Paint.Align.RIGHT);
13: canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p);
24.Typefaces:
获得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:(没看)
26.Vertices:(没看) 触摸一下,图片走形
27.Xfermodes:
圆形画法:
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 + W + 0.5f, y + H + 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 + H, null,
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 + W / 2, y - labelP.getTextSize() / 2,
43: labelP);
44:
45: x += W + 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 += H + 30;
51: }
52: }
53: }
注意:上面代码一定要有这两句,改成// canvas.save();都不成,会出现
1: int sc = canvas.saveLayer(x, y, x + W, y + H, null,
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会有抖动
代码如下:
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个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(设置动画的加速度效果)
首先在第一个TextView中加入动画效果: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效果的动画
layout为一个FrameLayout里放入一个ListView和一个ImageView ,动画是这两个View的切换效果
5.AutoComplete1
自动完成TextView,主要实现自动提示国家的英文
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_1line, COUNTRIES);
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
和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(没看出和上面的有什么不同的功能)
布局要注意:为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_1line, COUNTRIES);
3: MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.edit);
4: textView.setAdapter(adapter);
5: textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
8.Baseline1:
直接加载的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
布局:
注意:第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
此布局就是父View的Layout为android:orientation="horizontal"水平布局,然后子view再应用android:layout_gravity="center_vertical"和android:gravity="bottom"
11.Baseline6(没明白效果)
布局:
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
布局:
注意:TextView android: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:
主要是布局:
第二个按钮为小按钮,第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: <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: <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" />
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:
此布局用了自定义的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 时间控件
18.ExpandableList1 (没看)
用到android.widget.ExpandableListAdapter;
19.ExpandableList3(没看)
20.Focus1
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: 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: <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: 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: 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:
只是布局:
可以看出android:adjustViewBounds="true"为保持比例。
android:maxWidth="50dip" android:maxHeight="50dip"限制图片的最大宽高
android:maxWidth="70dip" android:maxHeight="70dip" android:padding="10dip" 限制图片最大宽高并在图片周围填充空白10dip
android:padding="10dip" android:layout_width="70dip" android:layout_height="70dip" 图片设置宽高为70,并在图片周围填充空白
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在加载时有个加载动画效果
注意:第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_1, mStrings));
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
此为布局动画,在加载整个布局时的动画效果
布局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随机动态显示
布局里有个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 以风格顺序方向显示
布局: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" />
动画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
布局:
注意:第三个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
布局:
注意:每个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
布局:
注意:第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
此例子在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
布局:
注意:主要起作用的是第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: <?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一直在屏幕的底部
布局:
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: <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 相对布局
布局:
注意:第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: <?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: <?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: <?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分布在左右两端
布局:
注意:关键在第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
布局:
注意:第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
布局:
注意:第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 下面的按钮可以隐藏表格的某行
布局:
注意:第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: 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: 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
布局:
注意: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
布局:
注意:第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
布局:
注意:第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布局
源码:见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
源码:第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选项时弹出内容
思路:
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(mContext, mTitles[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(mTitle, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
14: LayoutParams.WRAP_CONTENT));
15:
16: mDialogue = new TextView(context);
17: mDialogue.setText(dialogue);
18: addView(mDialogue, new 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
从布局中可以看出在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: @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_choice, GENRES));
7:
8: final ListView listView = getListView();
9:
10: listView.setItemsCanFocus(false);
11: listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);//设置选择行为,此为单选
12: }
58.List11 多选List
源码就这些:
注意第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_choice, GENRES));
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从最底部开始显示
布局:
注意:第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_1, mStrings);
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
在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_text, null);直接把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_text, null);
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 进度条
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 进度条
上面显示了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
此程序为两个按钮,上面的激活带标题的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: 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
布局:一个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.
布局:
注意:第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两个变量为 这两个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: }
66.ScrollBar1
它就在布局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
和上面的例子就差在颜色上,
注意第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:
2: setContentView(R.layout.scrollbar3);
3:
4: findViewById(R.id.view3).setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
布局:
注意:第114行的style 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: <?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
注意:源码第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"为提示,
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
源码:第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: 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: 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: <?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: <?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
布局: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: }