IOS-appstoreのダウンロード進捗ボタンを模倣


IOS-appstoreのダウンロード進捗ボタンを模倣
背景
カスタムviewを学ぶのはとても长い时间で、ずっとよく自分でいくつかのオープンソースのコントロールを书いたことがなくて、ちょうど最近时间があって、だからこの时间を利用してよくいくつかのコントロールを书くつもりで、多くの学友はカスタムviewを闻くと恐れて、実はあなたは第一歩を踏み出すだけでそれはとても简単なことで、しかもandroidの进级の道を学ぶ上で必然的にこの一歩があって、よく私达のカスタムviewを始めます!
先に効果を上げる
プログラマーはデザインが分からないので、自分で色を変えてもいいです.
使用
setListner(StateProgressListner listner)      
setmProgress(int mProgress)      
setmFirstColor(int mFirstColor)         
setmSecondColor(int mSecondColor)          
setmCircleWidth(int mCircleWidth)        
void setSrcStorp(int srcStorp)        
setSrcStart(int srcStart)          
void onDestory()     

構想
  • 空の大きな円環を描く
  • 次に進捗の弧を描く
  • 傍受touchイベント制御は、一時停止と開始のbitmap
  • を描く.
  • カスタムリスニング戻りボタンのステータス
  • 初期化作業
       //       
        private int mFirstColor;
        //       
        private int mSecondColor;
        //     
        private int mCircleWidth;
        //   
        private Paint mPaint;
        //     
        private int mProgress;
        //      
        private int centre;
        //     
        private Bitmap bitmap;
        //       
        private int srcStart;
        //       
        private int srcStorp;
        // 0    ;1  ;2  
        private int state;
        //     
        private StateProgressListner listner;

    円を描く
     centre = getWidth() / 2; //      x  
            int radius = centre - mCircleWidth;//   
            mPaint.setStrokeWidth(mCircleWidth); //        
            mPaint.setAntiAlias(true); //     
            mPaint.setStyle(Paint.Style.STROKE); //     
            //                 
            RectF oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius);
            mPaint.setColor(mFirstColor); //        
            canvas.drawCircle(centre, centre, radius, mPaint); //     

    経度の弧を描く
    mPaint.setColor(mSecondColor); //        
    mPaint.setStrokeCap(Paint.Cap.ROUND);//     
    canvas.drawArc(oval, -90, mProgress, false, mPaint); //        
    touchイベントのリスニング
    1.MotionEventイベントの傍受
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
    //       
                if (state == 0) {
                    stop();
                } else if (state == 1) {
                    start();
                }
            }
            return true;
        }

    2.描画開始と一時停止状態の画像
        /** *           * * @param canvas */
        private void drawBitmap(Canvas canvas) {
            if (bitmap != null) bitmap.recycle();
            bitmap = BitmapFactory.decodeResource(getResources(), state == 0 ? srcStart : srcStorp);
            if (bitmap != null) {
                int with = bitmap.getWidth();
                int height = bitmap.getHeight();
                canvas.drawBitmap(bitmap, centre - with / 2, centre - height / 2, mPaint);
            }
        }

    コールバックインタフェースのカスタマイズ
    1コールバッククラスの作成
        /** *        */
        public interface StateProgressListner {
            /** *    */
            void onstart();
    
            /** *    */
            void onstop();
    
            /** *    */
            void onfinish();
        }

    2コールバックイベントのトリガー
     /** *    */
        private void stop() {
            state = 1;
            if (listner != null) {
                listner.onstart();
            }
            invalidate();
        }
    
        /** *    */
        private void start() {
            state = 0;
            if (listner != null) {
                listner.onstop();
            }
            invalidate();
        }
    
        public int getmProgress() {
            return mProgress;
        }
    
        /** *       * * @param mProgress */
        public void setmProgress(int mProgress) {
            this.mProgress = mProgress;
            if (mProgress == 360 && listner != null) {
                listner.onfinish();
            }
            invalidate();
        }

    メインスレッドでの制御状態
    ここで私は本当にダウンロードしていないで、handerでダウンロードの進度の変化を模擬します
    public class MyView1Activity extends AppCompatActivity implements DownProgressView.StateProgressListner {
        @BindView(R.id.view1)
        DownProgressView view1;
        int progress;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my_view1);
            ButterKnife.bind(this);
            view1.setListner(this);
        }
    
    
        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                view1.setmProgress(++progress);
                handler.sendEmptyMessageDelayed(1, 20);
            }
    
        };
    
        @Override
        public void onstart() {
            handler.sendEmptyMessage(1);
        }
    
        @Override
        public void onstop() {
            handler.removeMessages(1);
        }
    
        @Override
        public void onfinish() {
            progress = 0;
            Toast.makeText(this, "     !    ", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            handler.removeMessages(1);
            view1.onDestory();
        }
    }

    オープンソースをソースアドレスまで行って、私を突き刺します!!!