1. 程式人生 > >手擼一個預載入頁面,酷炫環形進度條

手擼一個預載入頁面,酷炫環形進度條

高仿格瓦拉生活預載入頁面環形進度條——我稱之為二龍戲珠。話不多說先上圖。
這裡寫圖片描述

實現思路:
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語言裡 & 會自動變成&amp;  也不知道這個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 ,並且重寫