Android 사용자 정의 부하 진행 방법 두 가지

본 고 는 두 가지 방법 으로 자동차 부하 와 유사 한 진 도 를 쓸 것 이다.
LinearLayout 의 addview 방법 으로 for 순환 을 추가 합 니 다.
사용자 정의 컨트롤 방법 으로
선 캡 처

1.LinearLayout 의 addview 방법 에 for 순환 추가
1.1 processtest 01.xml 파일:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="horizontal" >
  <LinearLayout 
    android:id="@+id/ll"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    
  </LinearLayout>

</LinearLayout>

1.2 LinearLayout 의 하위 레이아웃 view 01.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:orientation="vertical" >
  <ImageView
    android:id="@+id/hezai_img"
    android:layout_width="12.5dp"
    android:layout_height="31.5dp"/>

</LinearLayout>

1.3 ProcessTest01.java

package com.example.progresstest;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class ProcessTest01 extends Activity {
  private LinearLayout ll;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.processtest01);
    
    ll = (LinearLayout) findViewById(R.id.ll);
    
    setProcess(16);
    
  }
  
  private void setProcess(int green){
    LayoutInflater inflater = this.getLayoutInflater();
    //          
    for (int i = 0; i < green; i++) {
      View v = inflater.inflate(R.layout.view01, null);
      ImageView img = (ImageView) v.findViewById(R.id.hezai_img);
      img.setImageResource(R.drawable.green);
      ll.addView(v);
    }
    //           
    for (int i = 0; i < 24-green; i++) {
      View v = inflater.inflate(R.layout.view01, null);
      ImageView img = (ImageView) v.findViewById(R.id.hezai_img);
      img.setImageResource(R.drawable.gray);
      ll.addView(v);
    }
  }
}

1.4 여기 경계 가 있 는 두 개의 그림 요소 와 관련된다.
마지막 캡 처

이런 방법 은 좋 은 점도 있 고 나 쁜 점도 있다.이런 방법 은 간단 하고 이해 하기 쉬 우 며 메모리 소모 가 적 고 운행 속도 가 빠르다.그러나 색깔 이 다 르 려 면 크기,색깔 이 다른 그림 을 스스로 잘라 야 하고 좌우 에 간격 이 있어 야 하기 때문에 비교적 번거롭다.다음 방법 은 컨트롤 을 사용자 정의 하 는 방법 이자 좋 은 것 도 있 고 나 쁜 것 도 있다.
2 사용자 정의 컨트롤 방법 으로
2.1 myprocesstest.xml 파일

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >
  <com.example.progresstest.HezaiProgress
    android:layout_marginTop="20dp"
    android:layout_gravity="center"
    android:id="@+id/process"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >
    
  </com.example.progresstest.HezaiProgress>

</LinearLayout>

이곳 의 com.example.progrestest 는 HezaiProgress 가 있 는 가방 이름 이 고 HezaiProgress 는 사용자 정의 컨트롤 코드 입 니 다.
2.2 HezaiProgress.java 파일

package com.example.progresstest;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.View.MeasureSpec;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

public class HezaiProgress extends View{
  private int process = 10;
  private int width,height;
  private int h = 32;
  private int w = 12;
  private int divideWidth=5;
  private int maxCount = 24;
  private int processColor=Color.GREEN;
  private int j = 1;
  private int num = 0;
  public int getProcessColor() {
    return processColor;
  }
  /**
   *      ,    “#ffffff”        
   * @param processColor
   */
  public void setProcessColor(String processColor) {
    char c = processColor.charAt(0);
    int r = 0;
    int g = 0;
    int b = 0;
    //       
    int rgb = Color.GREEN;
    if(c=='#'){
      for(int i = 1;i<processColor.length();i++){
        c = processColor.charAt(i);
        if(i<3){
          r += rOrgOrb(c,i);
        }
        else if(i<5){
          g += rOrgOrb(c,i);
        }else{
          b += rOrgOrb(c,i);
        }
        
      }
      rgb = Color.rgb(r, g, b);
    }
    this.processColor = rgb;
    
  }
  
  private int rOrgOrb(char c,int i){
    num++;
    char b = 0;
    if(c>='0'&&c<='9'){
      //j              
      if(i==j){
        //          
        b += Integer.valueOf(c)*16;
      }
      if(i==j+1){
        //          
        b += Integer.valueOf(c);
      }
    }
    //           
    if(c>='A'&&c<='F'){
      if(i==j){
        //ascii   55, A ASCII  65,  55   10
        b += ((int)c-55)*16;
      }
      if(i==j+1){
        b += (int)c-55;
      }
    }
    //           
    if(c>='a'&&c<='f'){
      if(i==j){
        //ascii   87, a ASCII  97,  87   10
        b += ((int)c-87)*16;
      }
      if(i==j+1){
        b += (int)c-87;
      }
    }
    //      ,  j 2
    if(num%2==0){
      j=j+2;
    }
    return b;
  }
  
  //       
  public int getMaxCount() {
    return maxCount;
  }
  //       
  public void setMaxCount(int maxCount) {
    this.maxCount = maxCount;
  }

  //    
  public int getProcess() {
    return process;
  }
  //    
  public void setProcess(int process) {
    this.process = process;
  }
  //      
  public void setDivideWidth(int divideWidth){
    this.divideWidth = divideWidth;
  }

  public HezaiProgress(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // TODO Auto-generated constructor stub
  }

  public HezaiProgress(Context context, AttributeSet attrs) {
    this(context, attrs,0);
    // TODO Auto-generated constructor stub
  }

  public HezaiProgress(Context context) {
    this(context,null);
    // TODO Auto-generated constructor stub
  }
  
  @Override
  protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    setHezai(16, canvas);
  }
  //       
  public void setProcessHeight(int h){
    if(h==0)
      this.h = 32;
    else
      this.h = h;
  }
  //       
  public void setProcessWidth(int w){
    if(w==0)
      this.w = 12;
    else
      this.w = w;
  }
  
  private void setHezai(int process,Canvas canvas){
    Rect rect;
    Paint paint;
    int tmp = 2;
    //    ,                ,         
    if(process*(w+tmp)+tmp>width)
      process = width/(w+divideWidth);
    //    
    for (int i = 0;i<process;i++){
      rect = new Rect(tmp, 2,w+tmp,h);
      paint = new Paint();
      tmp=tmp+w+divideWidth;
      paint.setColor(processColor);
      canvas.drawRect(rect, paint);

    }
    //      ,          
    for (int i = 0; i < maxCount-process; i++) {
      rect = new Rect(tmp, 2,w+tmp,h);
      paint = new Paint();
      tmp=tmp+w+divideWidth;
      paint.setColor(Color.rgb(211, 211, 211));
      canvas.drawRect(rect, paint);
    }
  }
  //dp   px
  private int dipToPx(int dip){
    float scale = getContext().getResources().getDisplayMetrics().density;
    return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));// 0.5       
  }
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // TODO Auto-generated method stub
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
    int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
    int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
    int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
    //MeasureSpec.EXACTLY,    
    if (widthSpecMode == MeasureSpec.EXACTLY || widthSpecMode == MeasureSpec.AT_MOST) {
      width = widthSpecSize;
    } else {
      //        ,            
      width = w;
    }
    //MeasureSpec.AT_MOST,    ,                 ,MeasureSpec.UNSPECIFIED     
    if (heightSpecMode == MeasureSpec.AT_MOST || heightSpecMode == MeasureSpec.UNSPECIFIED) {
      //           
      height = dipToPx(h);
    } else {
      height = heightSpecSize;
    }
    //        
    setMeasuredDimension(width, height);
    
  }
}

코드 에 상세 한 주석 을 달 았 으 니 여 기 는 말 하지 않 겠 습 니 다.
2.3 ProcessTest.java

package com.example.progresstest;

import android.app.Activity;
import android.os.Bundle;

public class ProcessTest extends Activity {
  private HezaiProgress process;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.myprocesstest);
    process = (HezaiProgress) findViewById(R.id.process);
    //      
    process.setProcessHeight(63);
    //      
    process.setProcessWidth(25);
    //      
    process.setDivideWidth(10);
    //      
    process.setProcessColor("#008b8b");
  }
}

여기 서 첫 번 째 방법 보다 좋 은 점 은 높이,너비,간격 너비,진도 색상 등 을 마음대로 바 꿀 수 있 고 코드 한 마디 만 있 으 면 됩 니 다.앞 에 이미 봉 인 했 지만 메모리 가 많이 소모 되 는 것 같 습 니 다.
여 기 는 색깔 을 바 꾼 후의 캡 처 입 니 다.바로 본 블 로그 의 첫 번 째 그림 입 니 다.

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기