国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義View過程解析

2020-04-11 10:54:54
字體:
來源:轉載
供稿:網友

Android自定義的view,主要是繼承view,然后實現ondraw這個方法,來進行繪制。

  • 1. 編寫自己的自定義view
  • 2. 加入邏輯線程
  • 3. 提取和封裝自定義view
  • 4. 利用xml中定義樣式來影響顯示效果

一、編寫自定義的view
1.在xml中使用自己的view

 <!-- 可以使用view的公共屬性,例如背景 --> <com.niuli.view.MyView   android:layout_width="match_parent"  android:layout_height="match_parent"  android:background="#ffff00"  />

2.通過繼承view,然后實現ondraw來實現方法

public class MyView extends View { Bitmap bitmap; public MyView(Context context) {  super(context);  /**   * getResources()可以獲取當前資源內的資源   */  bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); } public MyView(Context context, AttributeSet attrs) {  super(context, attrs);  bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); } /**  * 繪制是通過Canvas來承載,其就相當于一塊畫布  * 更多的學習將在不斷的做小東西中更新  */ @Override protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  /**   * Paint相當于一只畫筆,可以畫文字,幾何圖形,bit圖片等   */  Paint paint = new Paint();  //設置繪制的顏色,是否空心之類的都是對畫筆的設計  paint.setColor(Color.BLUE);  //繪畫文字  paint.setTextSize(30);  canvas.drawText("這是一個自定義view", 0, 30, paint);  //繪畫直線  canvas.drawLine(0, 60, 100, 60, paint);  //繪畫圓角矩形方法之一  //設置空心  paint.setStyle(paint.getStyle().STROKE);  RectF rec = new RectF(0, 90, 100, 190);  canvas.drawRoundRect(rec, 20, 20, paint);  //繪制圖片  canvas.drawBitmap(bitmap, 0, 350, paint); }}

效果

二、自定義的view+線程的使用控制
繪制文字,和圓形,通過線程控制使得其能在屏幕中移動

public class MyViewtwo extends View { //定義畫筆 private Paint paint = new Paint(); private int x; private float sweepAngle; private control thread; private Random random = new Random(); public MyViewtwo(Context context, AttributeSet attrs) {  super(context, attrs); } public MyViewtwo(Context context) {  super(context); } @Override protected void onDraw(Canvas canvas) {  paint.setTextSize(80);  //繪制文字  canvas.drawText("七夕快樂", x, 70, paint);  //繪制圖形  RectF rect = new RectF(0 ,80 ,100, 160);  canvas.drawArc(rect, 0, sweepAngle, true, paint);  //啟動線程  if (thread ==null) {   thread = new control();   thread.start();  } } public class control extends Thread{  @Override  public void run() {   while(true){    x +=3;    sweepAngle++;    if (x>getWidth()) {     x = (int) (0 - paint.measureText("七夕快樂"));    }    //控制圓的的旋轉    if (sweepAngle>360) {     sweepAngle = 0;    }    //設置畫筆顏色    paint.setARGB(255, random.nextInt(255), random.nextInt(255), random.nextInt(255));    //相當于刷新畫布    postInvalidate();    try {     sleep(30);    } catch (InterruptedException e) {     e.printStackTrace();    }   }  } }

效果 

 

三、封裝移動程序,模塊化思想
封裝主要是使用抽象方法,子類繼承后只要實現這些方法即可運行起來,大大簡化了程序

public abstract class MyViewtwo extends View { private control thread; public MyViewtwo(Context context, AttributeSet attrs) {  super(context, attrs); } public MyViewtwo(Context context) {  super(context); } //封裝,構造畫面,子類繼承后需要重寫 protected abstract void drawsub(Canvas canvas); @Override protected final void onDraw(Canvas canvas) {  //啟動線程  if (thread ==null) {   thread = new control();   thread.start();  }else {   drawsub(canvas);  } } //封裝移動方法,子類繼承后需要重寫 protected abstract void move(); public class control extends Thread{  @Override  public void run() {   while(true){    move();    //相當于刷新畫布    postInvalidate();    try {     sleep(30);    } catch (InterruptedException e) {     e.printStackTrace();    }   }  } }}

四、使用xml中定義樣式影響顯示效果
1、第一步就是在value文件夾中建立自己的樣式文件

<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="NumText">  <attr name="lineNum" format="integer"/>  <attr name="xScroll" format="boolean" /> </declare-styleable></resources>

2、xml中先要加入命名空間,然后就可以直接使用屬性

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:nt="http://schemas.android.com/apk/res/com.jikexueyuan.myview" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" > <com.jikexueyuan.myview.v4.NumText   android:layout_width="match_parent"  android:layout_height="match_parent"   nt:lineNum="6"  nt:xScroll="true"/></FrameLayout>

3、代碼中要有相應的解析xml中定義的這個元素

public NumText(Context context, AttributeSet attrs) {  super(context, attrs);  TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.NumText);  lineNum = ta.getInt(R.styleable.NumText_lineNum, 1);  xScroll = ta.getBoolean(R.styleable.NumText_xScroll, false);  ta.recycle(); }

主要就是利用以上方法和xml中定義元素值進行曝光相關聯。

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武冈市| 时尚| 和硕县| 澄城县| 贡嘎县| 兴海县| 三门县| 蕉岭县| 玛纳斯县| 安国市| 长葛市| 隆安县| 资源县| 金门县| 鄢陵县| 遵化市| 馆陶县| 伊春市| 巴彦县| 定日县| 土默特左旗| 麻栗坡县| 柳州市| 石泉县| 牟定县| 盘锦市| 灵山县| 马山县| 比如县| 南华县| 巴南区| 蓬莱市| 新干县| 海安县| 依安县| 汉阴县| 交城县| 双桥区| 三原县| 吉林省| 塔城市|