Android ApiDemo ——Graphics和View (1)
时间:2011-06-09 12:05:37 来源:中国it实验室 作者:wufenglong
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: @Override2: 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 border17: paint.setStyle(Paint.Style.STROKE);18: paint.setShader(null);// Pass null to clear any previous shader19: canvas.drawRect(x - 0.5f, y - 0.5f, x + W + 0.5f, y + H + 0.5f, paint);20: 21: // draw the checker-board pattern22: 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 bitmap27: int sc = canvas.saveLayer(x, y, x + W, y + H, null,28: Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG29: | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG30: | Canvas.FULL_COLOR_LAYER_SAVE_FLAG31: | 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 xfermode38: canvas.restoreToCount(sc);39: // canvas.restore();40: 41: // draw the label42: 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 row48: 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_FLAG3: | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG4: | Canvas.FULL_COLOR_LAYER_SAVE_FLAG5: | 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 resource14: 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 类型动画,从“0”移动到“10”,
注意:android:interpolator="@anim/cycle_7"这句为“插入器(窜改者)”
cycle_7.xml如下:
1: <?xml version="1.0" encoding="utf-8"?>2: cycle为循环,表示shake的动画在1秒内被循环7次
2.Animation2:最上面是一个ViewFlipper用于4个TextView顺序翻转,最下面是一个Spinner,用于选择翻转方式(4种)
先学习下布局:(1个ViewFlipper 下面有4个TextView)
1: 6: 7: 12: 18: 24: 30: 36: 37: 38: 44: 45: 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: 3: 4: 5: 6: res/anim/push_up_out.xml
1: <?xml version="1.0" encoding="utf-8"?>2: 3: 4: 5: 6: res/anim/push_left_in.xml
1: <?xml version="1.0" encoding="utf-8"?>2: 3: 4: 5: 6: res/anim/ hyperspace_in.xml
1: <?xml version="1.0" encoding="utf-8"?>2: 5: res/anim/ hyperspace_out.xml
1: <?xml version="1.0" encoding="utf-8"?> 2: 3: 5: 6: 10: 11: 12: 14: 15: 18: 19: 22: 23: 24: 以上几个动画可以直接用在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,主要实现自动提示国家的英文
这块的layout布局
1: 5: 6: 10: 11: 14: 15: 在AutoCompeteTextView里设置个Adapter
1: ArrayAdapter adapter = new ArrayAdapter(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: 6: 7: 11: 12:
7.AutoComplete6(没看出和上面的有什么不同的功能)
布局要注意:为MutiAutoCompleteTextView
1: 5: 6: 设置Adapter
1: ArrayAdapter adapter = new ArrayAdapter(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: 6: 7: 第4行和第10行的
android:layout_marginRight="30dip"
为此TextView右边有30像素的空白
9.Baseline3
布局:
注意:第11行的android:layout_gravity="center_vertical"表示在父View的中心
1: 6: 7: 13: 14: 20: 21: 27: 28:
10.Baseline4
此布局就是父View的Layout为android:orientation="horizontal"水平布局,然后子view再应用android:layout_gravity="center_vertical"和android:gravity="bottom"
11.Baseline6(没明白效果)
布局:
1: 4: 5: 10: 11: 17: 18:
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: 4: 5: 12: 13: 19: 20:
13.Buttons1:
主要是布局:
第二个按钮为小按钮,第14行style="?android:attr/buttonStyleSmall"
第三个按钮为开关按钮,ToggleButton
1: 5: 6: 7: 11: 12: 13: 18: 19: 23: 24:
14.ChronometerDemo 计时器
布局:
1: 6: 7: 9: 10: 对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: 注意这几个布局:
1: 9: 10: 19: 20: 29: 30: