Android 사용자 지정 부채 카운트다운 인스턴스 코드

6388 단어
하나.개술
엄밀히 말하면, 난 안드로이드 흰둥이야, 쓴 목적은 단지 지식으로 비축하려는 것뿐이야...그러나 다른 사람이 부주의로 나의 이 편을 찾아올지도 모른다고 생각하면 만약 내가 간단한 묘사일 뿐이라면 다른 사람이 이해하지 못할 수도 있고, 어쩌면 또 나무라게 될지도 모른다. 그러면 억울하지 않겠는가?
그래서 나는 문제와 과정을 명확하게 묘사했다. 이것도 나 자신에 대한 설명이고 이것도 나의 첫 번째 편이다. 나는 그것을 잘 해야 한다.
먼저 요구 사항을 말하자면 최근에 업무 중에 카운트다운을 해야 한다. 동그랗고 천천히 먹히는 애니메이션 카운트다운이다. 자신의 지식이 충분하지 않기 때문에 Canvas로 그려야 한다는 것만 알고 인터넷에서 한 바퀴 뒤졌는데 정태적으로 부채꼴을 그렸거나 컨트롤의 위치 크기를 조절할 수 없다는 것을 발견했다.어쨌든 한 바퀴 돌면서 캔버스 지식을 많이 배운 것 같지만, 자신도 안드로이드 흰둥이이기 때문에그래서 그 중에서 내가 원하는 애니메이션의 부채꼴 카운트다운을 정리할 수 없다. (여기서 말하자면 내가 이 물건을 처음 사용해서 편집에 익숙하지 않아서 효과도를 보지 못한다. 그러나 이곳의 코드는 매우 간단하다. 필요한 친구는 직접 가져가서 네가 필요로 하는 효과인지 확인해 볼 수 있다).
마지막으로 나는 어쩔 수 없이 내 친구에게 가르침을 청했다. 지금은 그도 신을 말할 수 없지만, 나보다 훨씬 낫다......여기서 말하자면 나는 단지 그의 논리를 더 많이 옮겼을 뿐이다.. 부끄럽다.. 나는 단지 지식의 비축으로 삼고 싶었기 때문이다..
둘.본문
아까도 말했듯이Canvas를 사용하기 때문에 우리는 먼저 하나의 컨트롤을 사용자 정의하고View의 사용자 정의 컨트롤을 직접 계승한다.
SweepView.java:

public class SweepView extends View {
  private static final int DEFAULT_WIDTH = 100;
  private static final int DEFAULT_HEIGHT = 100;
  private int mWidth;   //      
  private int mHeight;  //      
  private RectF rectF;
  private Paint paint;
  private int mColor = Color.RED;//       
  private float mSweep = 0;  //    
  public SweepView(Context context) {
    super(context);
    init();
  }
  public SweepView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
  }
  public SweepView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
  }
  private void init() {
    paint = new Paint();
    paint.setColor(mColor); //    
    paint.setStyle(Paint.Style.FILL);  //  
    paint.setAntiAlias(true);  //     
  }
  /**
   *       
   * UIThred
   */
  public void setColor(int color) {
    this.mColor = color;
    paint.setColor(mColor);
    //  onDraw  
    invalidate();
  }
  /**
   *        0-360
   * UIThred
   */
  public void setSweep(float mSweep) {
    this.mSweep = mSweep;
    //  onDraw  
    invalidate();
  }
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int resultWidth = measureWidth(widthMeasureSpec);
    int resultHeight = measureHeight(heightMeasureSpec);
    setMeasuredDimension(resultWidth, resultHeight);
  }
  /**
   *     
   *           ,   ...       .....0.0
   */
  private int measureWidth(int widthMeasureSpec) {
    int size = MeasureSpec.getSize(widthMeasureSpec);
    int mode = MeasureSpec.getMode(widthMeasureSpec);
    int result;
    if (mode == MeasureSpec.EXACTLY) {
      result = size;
    } else {
      result = DEFAULT_WIDTH;
      if (mode == MeasureSpec.AT_MOST) {
        result = Math.min(size, DEFAULT_WIDTH);
      }
    }
    return result;
  }
  /**
   *     
   *           ,   ...       .....0.0
   */
  private int measureHeight(int heightMeasureSpec) {
    int size = MeasureSpec.getSize(heightMeasureSpec);
    int mode = MeasureSpec.getMode(heightMeasureSpec);
    int result;
    if (mode == MeasureSpec.EXACTLY) {
      result = size;
    } else {
      result = DEFAULT_HEIGHT;
      if (mode == MeasureSpec.AT_MOST) {
        result = Math.min(size, DEFAULT_HEIGHT);
      }
    }
    return result;
  }
  @Override
  protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    this.mHeight = h;
    this.mWidth = w;
    rectF = new RectF(0, 0, w, h);
    super.onSizeChanged(w, h, oldw, oldh);
  }
  @Override
  protected void onDraw(Canvas canvas) {
    //   
    canvas.drawArc(rectF, -90, mSweep, true, paint);
  }
}

사용자 정의 View를 작성합니다. 분명히 우리는 그것을 사용해야 하기 때문에 레이아웃 파일에 다음과 같습니다. (단, 주의해야 할 것은, 위치와 크기를 조절하려면 View Group으로 싸야 합니다. View Group의 위치와 크기를 설정해서 컨트롤해야 합니다. 왜 그런지 저도 0.0을 알고 싶습니다.)
MainActivity.xml



  
    
  

마지막으로 코드에서 애니메이션 형태를 그리는 원형 부채형 카운트다운입니다.
MainActivity.java:

public class MainActivity extends AppCompatActivity {
  private SweepView sweepView;
  float angle = 0;//     
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sweepView = (SweepView) findViewById(R.id.sweepView);
    sweepView.setColor(Color.WHITE);  //      
    sweepView.setSweep(0); //    0 
    new Thread(new Runnable() {
      @Override
      public void run() {
        while (angle <= 360) { //             ,     3.6 50,   5      
          angle += 3.6;
          runOnUiThread(new Runnable() {
            @Override
            public void run() {
              sweepView.setSweep(angle);
            }
          });
          try {
            Thread.sleep(50);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }).start();
  }
}

셋.총결산
사용자 정의view에서 저는 아직 잘 모르는 부분이 많습니다. 왜냐하면 사용자 정의에 대한 자신의 인식이 부족하기 때문입니다. 그러나 저는 앞으로 그 중의 몇 가지 방법의 의미를 천천히 알게 될 것이라고 생각합니다.물론 만약 친구가 부주의로 이 글을 볼 수 있다면, 네가 나에게 의혹을 풀 수 있기를 바란다. 대단히 고맙다.

좋은 웹페이지 즐겨찾기