91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Android應用中實現自定義View

發布時間:2020-12-04 16:12:12 來源:億速云 閱讀:159 作者:Leah 欄目:移動開發

本篇文章為大家展示了如何在Android應用中實現自定義View,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

Android自定義view的種類

自定義view大概可以分為四個大類,主要是通過實現方式來區分

      1.自繪控件,繼承view,重寫onDraw方法,在其中進行繪制,需要自己適配邊距等等

      2.繼承ViewGroup派生的特殊Layout,主要用于實現自定義布局,也需要自己適配邊距等

      3.繼承特定的View(如TextView等),不用自己適配支持wrap_conten,match_parent,可以給其加入新的功能

      4.繼承特定的ViewGroup,例如linearlayout,多用于多個控件的組合view,也不用自己去做適配

自繪控件

這種自定義view是最復雜的一種,因為既要適配wrap_conten,match_parent又要通過條件判斷來在屏幕上繪制不同的內容,主要就是重寫onDraw方法

以下是一個簡單的onDraw重寫代碼

@Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
 
  final int paddingLeft = getPaddingLeft();
  final int paddingRight = getPaddingRight();
  final int paddingTop = getPaddingTop();
  final int paddingBottom = getPaddingBottom();
 
  //get the view's width and height and decide the radiu
  int width = getWidth() - paddingLeft - paddingRight;
  int height = getHeight() - paddingTop - paddingBottom;
  radiu = Math.min(width , height) / 2 - boundWidth - progressWidth;
 
  //setup the paint
  paint.setStyle(Paint.Style.STROKE);
  paint.setStrokeWidth(boundWidth);
  paint.setColor(Color.BLACK);
 
  //draw the inner circle
  int centerX = paddingLeft + getWidth()/2;
  int centerY = paddingTop + getHeight() / 2;
  canvas.drawCircle(centerX,centerY, radiu, paint);
  
 
  float totalRadiu = radiu +boundWidth +progressWidth/2;
 
  //draw the circlr pic
  if (drawable != null&&bitmap == null) {
   image = ((BitmapDrawable) drawable).getBitmap();
 
   bitmap = Bitmap.createBitmap((int)(2*totalRadiu),(int)(2*totalRadiu), Bitmap.Config.ARGB_8888);
   Canvas bitmapCanvas = new Canvas(bitmap);
 
   Paint bitmapPaint = new Paint();
   bitmapPaint.setAntiAlias(true);
 
   bitmapCanvas.drawCircle(totalRadiu, totalRadiu, radiu, bitmapPaint);
 
   bitmapPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
   bitmapCanvas.drawBitmap(image,null,new RectF(0,0,2*totalRadiu,2*totalRadiu) , bitmapPaint);
 
 
  }
  Rect rect = new Rect((int)(centerX -totalRadiu),(int)(centerY-totalRadiu),(int)(centerX+totalRadiu),(int)(centerY+ totalRadiu));
  canvas.save();
  if(isRotate)
  canvas.rotate(rotateDegree,centerX,centerY);
  canvas.drawBitmap(bitmap,null ,rect, paint);
 
  canvas.restore();
  //set paint for arc
  paint.setStrokeWidth(progressWidth);
  paint.setStrokeCap(Paint.Cap.ROUND);
 
  //prepare for draw arc
  RectF oval = new RectF();
  oval.left = centerX -totalRadiu ;
  oval.top =centerY- totalRadiu ;
  oval.right = centerX + totalRadiu;
  oval.bottom = centerY+ totalRadiu;
  paint.setColor(progressBackColor);
 
  //draw background arc
  canvas.drawArc(oval, arcStar, arcEnd, false, paint);
 
  //draw progress arc
  paint.setColor(progressColor);
  canvas.drawArc(oval, arcStar, progress, false, paint);
 }

關于這個例子的完整版本,請查看另外一篇文章點擊這里

繼承ViewGroup派生的特殊Layout

主要是通過在方法中加載特定的布局,在對其內部的各個view的行為進行指定來實現。

繼承特定的View(如TextView等)

可以增加特定view對特定事件的響應

繼承指定ViewGroup的view

也是通過加載特定布局,再在其中處理view的行為來實現,大部分繼承ViewGroup的自定義view都可以用此方法實現,不過viewgroup的方式更接近底層。

一個簡單的例子

 public MyView(Context context, AttributeSet attrs) { 
  super(context, attrs); 
  LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
  inflater.inflate(R.layout.imagebtn, this); 
  imageView=(ImageView) findViewById(R.id.imageView1); 
  textView=(TextView)findViewById(R.id.textView1);  
 } 

上述內容就是如何在Android應用中實現自定義View,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泗阳县| 枞阳县| 长汀县| 集安市| 鄂尔多斯市| 遂溪县| 扬中市| 博爱县| 陵水| 吉首市| 辉县市| 遂溪县| 金乡县| 克山县| 伊春市| 新化县| 霞浦县| 赣榆县| 普陀区| 额尔古纳市| 娱乐| 福贡县| 靖西县| 永平县| 宁乡县| 缙云县| 杭锦后旗| 阳城县| 道孚县| 永清县| 开平市| 顺义区| 武城县| 大冶市| 三穗县| 读书| 喀喇沁旗| 永兴县| 柳江县| 昌宁县| 皮山县|