IOS-appstoreのダウンロード進捗ボタンを模倣
IOS-appstoreのダウンロード進捗ボタンを模倣
背景
カスタムviewを学ぶのはとても长い时间で、ずっとよく自分でいくつかのオープンソースのコントロールを书いたことがなくて、ちょうど最近时间があって、だからこの时间を利用してよくいくつかのコントロールを书くつもりで、多くの学友はカスタムviewを闻くと恐れて、実はあなたは第一歩を踏み出すだけでそれはとても简単なことで、しかもandroidの进级の道を学ぶ上で必然的にこの一歩があって、よく私达のカスタムviewを始めます!
先に効果を上げる
プログラマーはデザインが分からないので、自分で色を変えてもいいです.
使用
構想空の大きな円環を描く 次に進捗の弧を描く 傍受 を描く.カスタムリスニング戻りボタンのステータス 初期化作業
円を描く
経度の弧を描く
1.MotionEventイベントの傍受
2.描画開始と一時停止状態の画像
コールバックインタフェースのカスタマイズ
1コールバッククラスの作成
2コールバックイベントのトリガー
メインスレッドでの制御状態
ここで私は本当にダウンロードしていないで、handerでダウンロードの進度の変化を模擬します
オープンソースをソースアドレスまで行って、私を突き刺します!!!
背景
カスタム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();
}
}
オープンソースをソースアドレスまで行って、私を突き刺します!!!