手机出现com.android.apidemo,Android ApiDemo ——Graphics和View (1)

这篇博客详细介绍了Android中的图形绘制,包括Path、贝塞尔曲线、Typeface、Unicode图表、Vertices、Xfermodes等概念,并展示了如何在onDraw()方法中使用。此外,还探讨了视图动画,如Shake动画、ViewFlipper的翻转效果、Transition3D、AutoCompleteTextView的自动完成功能以及Chronometer的使用。文章通过实例代码展示了各种动画效果和图形绘制技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android ApiDemo ——Graphics和View (1)

时间:2011-06-09 12:05:37 来源:中国it实验室 作者:wufenglong

package com.example.android.apis.graphics;

23.TextAlign:

372944a6288add66fcdd5ba385be59ac.gif

设置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()方法中:

803e317a81782fae3c781837820ba8ff.gif

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,画画 c971e6256bbc437ba3450f6beb6924f6.gif

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);

31f0b7c942714f245588799974068dc6.gif

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:

fb7c0c0af3f1ed1664c6afd467e1d75b.gif

获得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:(没看)

01db0ec3acdc2e762af45df9a19c055d.gif

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

c407368ebc97f8c40e9d791b28de79b8.gif

27.Xfermodes:

d8de28bb0d648030d7d1447c0166de89.gif

圆形画法:

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();都不成,会出现 a7d26199981f221b72f4493b0abfd604.gif

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会有抖动

4fd7642cfd3acc6693de9d4ca3e8e53a.gif

代码如下:

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种)

6566eb4f271835f8b5bc9f8a33c2bc03.gif

先学习下布局:(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(设置动画的加速度效果)

06599e033898e3e9b58632f13ed3de25.gif

首先在第一个TextView中加入动画效果:df11afa9b8a97aaa51870509f1357247.gif

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效果的动画

6acc280f314ebe040c039e5b3f704b3c.gif

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

5.AutoComplete1

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

d14aa0cb9a659461d9a369a69aae156d.gif

d3221e8b5d63018026d10acf32612b7c.gif

这块的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

2e5941959c42419c7d7b1699abf293c6.gif

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

1:  6:   7:      11:  12:     

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

1693e9083a1d288118c3365e89e22c1b.gif

布局要注意:为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:

d1f742c6379ceaceef3328685af5e6ee.gif

直接加载的layout布局:

1:  6:   7:      第4行和第10行的

android:layout_marginRight="30dip"

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

9.Baseline3

3996fa6cddd516514aa89c0596394703.gif

布局:

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

1:  6:   7:          13:  14:          20:  21:          27:  28:     

10.Baseline4

44028a5f6e0d57ebba850cc87375b774.gif

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

11.Baseline6(没明白效果)

21e9ef6bdb32da30b7cc0434527cebd7.gif

布局:

1:  4:   5:      10:  11:      17:  18: 

12.Baseline7

6fc1219725837cb0a193de887e87b9ab.gif

布局:

注意: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:

5ce78c6f583e1a0ba30531f8f49baa7a.gif

主要是布局:

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

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

1:  5:           6:          7:          11:  12:          13:          18:  19:          23:              24:     

14.ChronometerDemo 计时器

95b2e92a228aa4b762c6279e32702541.gif

布局:

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:

07ccbdf8b2999b51dd0023309c7450a3.gif

6e32ffa8c4bdf409b185c5de055e3329.gif 

此图的布局:

1:  注意这几个布局: 64a1e436f6fceb63d8ff8ec22f520a87.gif

1:  9:  10:          19:  20:          29:  30:         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值