Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自定義View過程解析

Android自定義View過程解析

編輯:關於Android編程

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中定義元素值進行曝光相關聯。

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved