色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android自定義view實(shí)現(xiàn)倒計(jì)時(shí)控件

瀏覽:98日期:2022-09-22 08:36:45

本文實(shí)例為大家分享了Android自定義view實(shí)現(xiàn)倒計(jì)時(shí)控件的具體代碼,供大家參考,具體內(nèi)容如下

Android自定義view實(shí)現(xiàn)倒計(jì)時(shí)控件

Android自定義view實(shí)現(xiàn)倒計(jì)時(shí)控件

直接上代碼

自定義TextView

文字展示

public class StrokeTextView extends TextView { private TextView borderText = null;///用于描邊的TextView private Context mContext; public StrokeTextView(Context context) { super(context); mContext = context; borderText = new TextView(context); init(); } public StrokeTextView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; borderText = new TextView(context, attrs); init(); } public StrokeTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; borderText = new TextView(context, attrs, defStyle); init(); } public void init() { TextPaint tp1 = borderText.getPaint(); tp1.setStrokeWidth(12); //設(shè)置描邊寬度 tp1.setStyle(Paint.Style.STROKE);//對(duì)文字只描邊 //設(shè)置自定義字體 Typeface fromAsset = Typeface.createFromAsset(mContext.getAssets(), 'fonts/Alibaba-PuHuiTi-Heavy.ttf'); borderText.setTypeface(fromAsset, Typeface.ITALIC); //自定義字體 ITALIC斜體 borderText.setTextColor(Color.parseColor('#F46059')); //設(shè)置描邊顏色 borderText.setShadowLayer(3.0F, 2F, 2F, Color.parseColor('#ffd44042')); //設(shè)置陰影效果(投影) borderText.setGravity(getGravity()); } @Override public void setLayoutParams(ViewGroup.LayoutParams params) { super.setLayoutParams(params); borderText.setLayoutParams(params); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { CharSequence tt = borderText.getText(); //兩個(gè)TextView上的文字必須一致 if (tt == null || !tt.equals(this.getText())) { borderText.setText(getText()); this.postInvalidate(); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); borderText.measure(widthMeasureSpec, heightMeasureSpec); } protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); borderText.layout(left, top, right, bottom); } @Override protected void onDraw(Canvas canvas) { borderText.draw(canvas); super.onDraw(canvas); }}

xml

<LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' xmlns:tools='http://schemas.android.com/tools' android:layout_width='match_parent' android:background='#F3B243' android:layout_height='match_parent' tools:context='.countdown.TestCountActivity'> <RelativeLayout android:layout_width='match_parent' android:layout_height='wrap_content'> <com.xiao.test.countdown.StrokeTextView android:layout_marginTop='100dp' android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:background='@drawable/play_advertising_timer_bg' android:paddingLeft='15dp' android:textColor='#FFFFFF' android:textSize='33sp' android:layout_centerHorizontal='true' android:layout_gravity='center' android:gravity='center_vertical' android:textStyle='italic' android:typeface='monospace' tools:ignore='RtlSymmetry' android:paddingStart='15dp' /> </RelativeLayout></LinearLayout>

倒計(jì)時(shí)幫助類(lèi)

public class CountDownHelper { private OnCountDownListener onCountDownListener; private Disposable disposable; private long remainingTime; public CountDownHelper(long remainingTime) { this.remainingTime = remainingTime; } /** * 回收倒計(jì)時(shí) */ public void destory() { if (disposable != null && !disposable.isDisposed()) { disposable.dispose(); } } /** * 開(kāi)始倒計(jì)時(shí) */ public void startCompute() { Observable.interval(1, TimeUnit.SECONDS) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Long>() { @Override public void onSubscribe(Disposable d) { disposable = d; } @Override public void onNext(Long aLong) { if (onCountDownListener == null) { return; } remainingTime -= 1000; if (remainingTime > 0) { int day = (int) (remainingTime / (1000 * 60 * 60 * 24)); int hour = (int) ((remainingTime % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); int minute = (int) ((remainingTime % (1000 * 60 * 60)) / (1000 * 60)); int second = (int) ((remainingTime % (1000 * 60)) / 1000); String dayStr = day >= 10 ? String.valueOf(day) : '0' + day; String hourStr = hour >= 10 ? String.valueOf(hour) : '0' + hour; String minuteStr = minute >= 10 ? String.valueOf(minute) : '0' + minute; String secondStr = second >= 10 ? String.valueOf(second) : '0' + second; onCountDownListener.countDown(dayStr, hourStr, minuteStr, secondStr); if (remainingTime <= 0) {onCountDownListener.countDownFinish();if (disposable != null && !disposable.isDisposed()) { disposable.dispose();} } } else { onCountDownListener.countDownFinish(); if (disposable != null && !disposable.isDisposed()) {disposable.dispose(); } } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } /** * 設(shè)置倒計(jì)時(shí)回調(diào)監(jiān)聽(tīng) * * @param onCountDownListener 倒計(jì)時(shí)監(jiān)聽(tīng) */ public void setOnCountDownListener(OnCountDownListener onCountDownListener) { this.onCountDownListener = onCountDownListener; } public interface OnCountDownListener { /** * 倒計(jì)時(shí) * * @param day 天 * @param hour 小時(shí) * @param minute 分鐘 * @param second 秒 */ void countDown(String day, String hour, String minute, String second); /** * 倒計(jì)時(shí)完成 */ void countDownFinish(); }}

TestCountActivity.java

public class TestCountActivity extends AppCompatActivity { private CountDownHelper mCountDownHelper; private StrokeTextView mTvTest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test_count); mTvTest = findViewById(R.id.tv_test);//設(shè)置自定義字體 Typeface fromAsset = Typeface.createFromAsset(getAssets(), 'fonts/Alibaba-PuHuiTi-Heavy.ttf'); mTvTest.setTypeface(fromAsset, Typeface.ITALIC); //自定義字體 ITALIC斜體 long aLong = 1787; mCountDownHelper = new CountDownHelper(aLong * 1000); mCountDownHelper.startCompute(); mCountDownHelper.setOnCountDownListener(new CountDownHelper.OnCountDownListener() { @SuppressLint('SetTextI18n') @Override public void countDown(String day, String hour, String minute, String second) { mTvTest.setText(hour + ':' + minute + ':' + second); } @Override public void countDownFinish() { Log.d('', '結(jié)束倒計(jì)時(shí)'); mCountDownHelper.destory(); //延時(shí)跳轉(zhuǎn) new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { Toast.makeText(TestCountActivity.this, '時(shí)間到了', Toast.LENGTH_SHORT).show(); return false; } }).sendEmptyMessageDelayed(0, 10000);//表示延遲10秒發(fā)送任務(wù) } }); }}

引入依賴

implementation ‘io.reactivex.rxjava2:rxjava:2.0.1’implementation ‘io.reactivex.rxjava2:rxandroid:2.0.1’

歡迎小伙伴們?cè)u(píng)論

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 婷婷亚洲久悠悠色在线播放 | 亚洲国产成人久久精品图片 | 一级毛片在线免费看 | 久久综合丁香 | 欧美一级成人毛片影院 | 中文字幕乱码系列免费 | 日韩三级视频 | 99色在线视频 | 成人欧美精品一区二区不卡 | 国产精品国产欧美综合一区 | 日本成人免费在线视频 | 日韩精品无码一区二区三区 | 99久久免费看国产精品 | 久久国产精品成人免费 | 欧美区一区 | 国产高中生粉嫩无套第一次 | 国产91无套剧情在线播放 | 杨幂国产精品福利在线观看 | 日韩经典中文字幕 | 美女扒开双腿让男人爽透视频 | 成人国产精品免费视频不卡 | 日本阿v视频在线观看高清 日本波多野结衣视频 | 精品国产综合区久久久久久 | 国产成人精品一区二三区 | 久久久久久免费播放一级毛片 | 草久久久 | 日韩毛片一级 | 国产成人综合久久精品红 | 成视频年人黄网站免费 | 乱淫毛片 | 精品一区二区久久 | 亚洲国内精品 | 国内精品久久久久久久星辰影视 | 牛人国产偷窥女洗浴在线观看 | 91原创在线 | 久久精品国产精品亚洲毛片 | 久久一区二区精品综合 | 成人久久| 欧美精品99久久久久久人 | 亚洲精品在线网 | 国产网站在线看 |