手擼一個預載入頁面,酷炫環形進度條
高仿格瓦拉生活預載入頁面環形進度條——我稱之為二龍戲珠。話不多說先上圖。
實現思路:
1、自定義一個view,畫兩個從點變換到半圓的弧形。
需要拓展的功能點:
1、需要展現出一個動畫效果。
2、進度條走滿的時候需要觸發介面的跳轉。
3、繪製的控制元件要有自適應螢幕的能力。
功能點,以及實現方式的說明:
實現螢幕適配的方式
//獲取螢幕的寬高 重新計算自定義控制元件的大小
public void reSetViewSize(){
DisplayMetrics metrics = myApplication.getInstance().getResources().getDisplayMetrics();
int dpi = metrics.densityDpi;
switch (dpi){
case 480 :
mStrokeWidth = 10;
mHalfStrokeWidth = mStrokeWidth / 2;
mRadius = 80;
textSize = 45;
break;
case 160:
mStrokeWidth = 4;
mHalfStrokeWidth = mStrokeWidth / 2 ;
mRadius = 30;
textSize = 15;
break;
case 240:
mStrokeWidth = 5;
mHalfStrokeWidth = mStrokeWidth / 2;
mRadius = 40;
textSize = 22;
break;
case 320:
mStrokeWidth = 8 ;
mHalfStrokeWidth = mStrokeWidth / 2;
mRadius = 60;
textSize = 30;
break;
case 640:
mStrokeWidth = 16;
mHalfStrokeWidth = mStrokeWidth / 2;
mRadius = 120;
textSize = 60;
break;
default:
break;
}
init();
}
在使用控制元件的介面當中顯示的呼叫reSetViewSize()以實現根據螢幕的寬高按比例重置控制元件的寬高。
2、實現載入進度條的一個動畫效果:
final float alpha = mProgress / (float)mMax * 180;
canvas.drawArc(mRect , 90+alpha , alpha , false , mFrontPaint);
//左邊一半
canvas.drawArc(mRect, alpha-90, alpha, false , mFrontPaint);
Rect bounds = new Rect();
mTextPaint.getTextBounds("跳過",0,2,bounds);
canvas.drawText("跳過", (mWidth/2) , (mHeight/2) + (bounds.height()/2), mTextPaint);
if (mProgress < mMax) {
mProgress += 1;
invalidate();
}
3、進度條走滿的時候通知介面進行相關操作。(通過定義介面,用介面回撥的方式)
if (mProgress < mMax) {
mProgress += 1;
invalidate();
}else {
//TODO 編寫一個回撥方法 回撥介面
callBack.handleAty();
}
//供外部進行進行回撥
public void initCallBack(callBackAty callBack){
this.callBack = callBack;
}
public interface callBackAty{
public void handleAty();
}
自定義控制元件的原始碼:
public class MyWaitingProgress extends View {
private Paint mBackPaint;
private Paint mFrontPaint;
private Paint mTextPaint;
private float mStrokeWidth = 10;
private float mAlphaStrokeWidth = 12;
private float mHalfStrokeWidth = mStrokeWidth / 2;
private float mRadius = 60;
//文字大小
//文字的筆畫寬度
private float textSize = 45;
private RectF mRect;
private int mProgress = 0;
//目標值,想改多少就改多少
private int mMax = 150;
private int mWidth;
private int mHeight;
private callBackAty callBack;
//獲取螢幕的寬高 重新計算自定義控制元件的大小
public void reSetViewSize(){
DisplayMetrics metrics = myApplication.getInstance().getResources().getDisplayMetrics();
int dpi = metrics.densityDpi;
switch (dpi){
case 480 :
mStrokeWidth = 10;
mHalfStrokeWidth = mStrokeWidth / 2;
mRadius = 80;
textSize = 45;
break;
case 160:
mStrokeWidth = 4;
mHalfStrokeWidth = mStrokeWidth / 2;
mRadius = 30;
textSize = 15;
break;
case 240:
mStrokeWidth = 5;
mHalfStrokeWidth = mStrokeWidth / 2;
mRadius = 40;
textSize = 22;
break;
case 320:
mStrokeWidth = 8;
mHalfStrokeWidth = mStrokeWidth / 2;
mRadius = 60;
textSize = 30;
break;
case 640:
mStrokeWidth = 16;
mHalfStrokeWidth = mStrokeWidth / 2;
mRadius = 120;
textSize = 60;
break;
default:
break;
}
init();
}
public MyWaitingProgress(Context context) {
super(context);
// init();
}
public MyWaitingProgress(Context context, AttributeSet attrs) {
super(context, attrs);
// init();
}
public MyWaitingProgress(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// init();
}
//初始化畫筆
private void init() {
mBackPaint = new Paint();
mBackPaint.setColor(getResources().getColor(R.color.load_progress));
mBackPaint.setAntiAlias(true);
mBackPaint.setStyle(Paint.Style.STROKE);
mBackPaint.setStrokeWidth(mStrokeWidth);
mFrontPaint = new Paint();
mFrontPaint.setColor(getResources().getColor(R.color.load_progress));
mFrontPaint.setAntiAlias(true);
mFrontPaint.setStyle(Paint.Style.STROKE);
mFrontPaint.setStrokeWidth(mStrokeWidth);
mTextPaint = new Paint();
mTextPaint.setColor(getResources().getColor(R.color.load_progress));
mTextPaint.setAntiAlias(true);
mTextPaint.setTextSize(textSize);
mTextPaint.setTextAlign(Paint.Align.CENTER);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = getRealSize(widthMeasureSpec);
mHeight = getRealSize(heightMeasureSpec);
//呼叫系統的api設定控制元件的寬高
setMeasuredDimension(mWidth, mHeight);
}
@Override
protected void onDraw(final Canvas canvas) {
initRect();
final float alpha = mProgress / (float)mMax * 180;
canvas.drawArc(mRect , 90+alpha , alpha , false , mFrontPaint);
//左邊一半
canvas.drawArc(mRect, alpha-90, alpha, false , mFrontPaint);
Rect bounds = new Rect();
mTextPaint.getTextBounds("跳過",0,2,bounds);
canvas.drawText("跳過", (mWidth/2) , (mHeight/2) + (bounds.height()/2), mTextPaint);
if (mProgress < mMax) {
mProgress += 1;
invalidate();
}else {
//TODO 編寫一個回撥方法 回撥介面
callBack.handleAty();
}
}
public int getRealSize(int measureSpec){
int result = 1;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
//根據數值計算線的寬度和半徑的大小
if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.UNSPECIFIED) {
//自己計算
result = (int) (mRadius * 2 + mStrokeWidth);
} else {
result = size;
}
return result;
}
private void initRect() {
if (mRect == null) {
mRect = new RectF();
int viewSize = (int) (mRadius * 2);
int left = (mWidth - viewSize) / 2;
int top = (mHeight - viewSize) / 2;
int right = left + viewSize;
int bottom = top + viewSize;
mRect.set(left, top, right, bottom);
}
}
//供外部進行進行回撥
public void initCallBack(callBackAty callBack){
this.callBack = callBack;
}
public interface callBackAty{
public void handleAty();
}
}
xml檔案中使用
<com.huaxinzhi.testbeautprogress.MyWaitingProgress
android:id="@+id/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
介面中呼叫
progress = (MyWaitingProgress) findViewById(R.id.progress);
progress.reSetViewSize();
progress.initCallBack(new MyWaitingProgress.callBackAty() {
@Override
public void handleAty() {
Toast.makeText(MainActivity.this, "進度圓滿", Toast.LENGTH_SHORT).show();
}
});
相關推薦
手擼一個預載入頁面,酷炫環形進度條
高仿格瓦拉生活預載入頁面環形進度條——我稱之為二龍戲珠。話不多說先上圖。 實現思路: 1、自定義一個view,畫兩個從點變換到半圓的弧形。 需要拓展的功能點: 1、需要展現出一個動畫效果。 2、進度條走滿的時候需要觸發介面的跳轉。 3、繪製的控制
mui.預載入頁面,傳值失敗
1.此為搜尋頁到列表頁的邏輯編寫 搜尋頁面: mui.init({ preloadPages: [{ url: 'order-1-search.html', id: 'order-1-search.html' }] }); mui.ready(function
MUI預載入頁面跳轉並傳遞引數的問題,Uncaught Error: webview[某個頁面的id] does not exist
最近剛剛入門mui,學習慕課上仿豆瓣app,但是在預載入和跳轉頁面中出現了以下問題。 Uncaught Error: webview[某個頁面的id] does not exist 具體程式碼如下: //預載入電影詳
第二篇-用Flutter手擼一個抖音國內版,看看有多炫
前言 繼上一篇使用Flutter開發的抖音國際版 後再次擼一個國內版抖音,大部分功能已完成,主要是Flutter開發APP速度很爽, 先看下圖 專案主要結構介紹 這次主要的改動在api.dart 及douyin.dart裡,國內抖音的api
第三篇-用Flutter手擼一個抖音國內版,看看有多炫
前言 前一篇已經開發了大部分框架,包含視訊上下滑動播放,這次將上次未完成的資料顯示友好顯示,以及底部音樂走馬燈特效,另外優化了載入資料的bug,在dart語言裡 & 會自動變成& 也不知道這個bug啥時候修復哈. 本系列會持續更新,將各個模組及功能持續完善.  
第四篇-用Flutter手擼一個抖音國內版,看看有多炫
前言 這次對佈局進行優化,主要包含了首頁tabview pageview 以及新增幾個按鈕的操作過程.主要使用到stack層疊佈局,tabpview和pageview,tabview兩個頁面,一個關注,一個推薦,左右切換,pageview被包含在tabview裡面. 佈局優化 抖音的頂部appbar 是懸
手擼一個外賣點餐系統後臺,可以寫上簡歷的實戰專案!
## 外賣點餐系統的實現 ## 實體類的編寫 (1)菜品類(菜品id,菜品名,菜品型別,上架時間,單價,月銷售,總數量) ``` import java.util.Date; public class Menu { private String mid; private String name;
window.open打開一個新空白頁面,不會自動刷新【解決方案】
form turn targe push .get action html pos bstr 調用js方法: function BuildPostForm(fm, url, target) { var e = null, el = []; if (
手擼一個Vue滾動加載自定義指令
請求 tel document javascrip 決定 tlist win 滾動加載 pos 用Vue在移動端做滾動加載,使用mint-ui框架, InfiniteScroll指令loadmore組件,在uc瀏覽器和qq瀏覽器都無法觸發。無奈我只能自己寫了。 決定用vu
初學html,任務1:一個簡單html頁面,要求:內容頁面裝一篇文章 用html來分段
enter pos 工程師 分享圖片 visit 技術 運行 並且 center 這是主要內容部分,用html實現版塊分布。 接下來是樣式部分。 讓頁面所有元素的padding和margin都設置為0 ; 否則加入一張大的覆蓋的背景圖片後,會由於瀏覽器的緣故,圖片周邊有
手擼 Pandas - 01:Numpy,基礎視覺化,聚合,標準差
匯入需要的模組,相應資料下載地址:https://grouplens.org/datasets/movielens/ import pandas as pd import time import os import warnings warnings.filterwarnings('ignore')
手擼RNN分類和迴歸,1024!
記錄下最近看莫凡大佬的python教程中,如何手擼RNN分類和迴歸兩種實現方式。 分類實現(具體需要主要的細節已經在程式碼中備註): import tensorflow as tf from tensorflow.examples.tutorials.mnist import input
從 0 開始手寫一個 Spring MVC 框架,向高手進階
Spring框架對於Java後端程式設計師來說再熟悉不過了,以前只知道它用的反射實現的,但瞭解之後才知道有很多巧妙的設計在裡面。如果不看Spring的原始碼,你將會失去一次和大師學習的機會:它的程式碼規範,設計思想很值得學習。 我們程式設計師大部分人都是野路子,不懂什麼
手把手教你實現一個視覺化爬蟲監控系統,酷炫的圖形化介面
1. 前言 本文並不是講解爬蟲的相關技術實現的,而是從實用性的角度,將抓取並存入 MongoDB 的資料 用 InfluxDB 進行處理,而後又通過 Grafana 將爬蟲抓取資料情況通過酷炫的圖形化介面展示出來。 在開始之前,先對 Grafana 和 InfluxDB 做一下簡要的介紹:
使用Java Socket手擼一個http服務器
con body buffered run value nal uic news ble 原文連接:使用Java Socket手擼一個http服務器 作為一個java後端,提供http服務可以說是基本技能之一了,但是你真的了解http協議麽?你知道知道如何手擼一個htt
使用Java Socket手擼一個http伺服器
原文連線:使用Java Socket手擼一個http伺服器 作為一個java後端,提供http服務可以說是基本技能之一了,但是你真的瞭解http協議麼?你知道知道如何手擼一個http伺服器麼?tomcat的底層是怎麼支援http服務的呢?大名鼎鼎的Servlet又是什麼東西呢,該怎麼使用呢? 在
Android手擼一個今日頭條視訊下載器
前言 今日頭條是我最喜歡的app之一,當然喜歡並不是因為內容精彩,而是逗比的評論,而且看視訊的沒有廣告,我這個人喜歡收藏,尤其是小視訊(手動滑稽),可是卻沒有下載的按鈕,之後在仿今日頭條專案裡也需要用到視訊,進入網頁右鍵另存為也比較麻煩,作為程式猿,這
自己寫了一個拍照的頁面,但是儲存的圖片太模糊了。求大神幫忙看看
public class PhotographActivity extends Activity implements SeekBar.OnSeekBarChangeListener, OnClickListener, Runnable { private Ima
巧力避免ViewPager的預載入資料,Tablayout+Fragment+viewPager
問題描述 最近在進行一個專案的開發,其中使用到了Tablayout+Fragment+viewPager來搭建一個基本的框架,從而出現了設定資料介面卡的時候,item的位置錯亂問題。我列印log日
webview載入頁面,JS方法不能載入的問題解決
今天發現在webview,沒有辦法載入JS方法,跳不出那種提示框,就是寫了webview.getSettings().setJavaScriptEnabled(true); 這一句也完全沒用。後來發現網上說的解決方案是用要用到WebChromeClient ,並且重寫