Android 사용자 정의 보기 프로 세 스 분석

6537 단어 AndroidView
Android 사용자 정의 view 는 주로 view 를 계승 한 다음 ondraw 라 는 방법 을 실현 하여 그립 니 다.
사용자 정의 view 작성
논리 스 레 드 가입
사용자 정의 view 추출 및 패키지
4.567917.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);
 }

}

효과.

2.사용자 정의 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();
    }
   }
  }
 }
효과. 
 
3.모 바 일 프로그램 패키지,모듈 화 사상
포장 은 주로 추상 적 인 방법 을 사용 하 는데 하위 클래스 를 계승 한 후에 이런 방법 만 실현 하면 운행 할 수 있 고 절 차 를 크게 간소화 했다.

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

}

4.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 에서 정 의 된 요소 값 을 이용 하여 노출 과 관련 이 있다.
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기