GVKun编程网logo

JS进度加载条效果(js进度加载条效果不一样)

8

关于JS进度加载条效果和js进度加载条效果不一样的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android自定义webView头部进度加载效果、ASP.NET实现进度条效果、C#实现炫

关于JS进度加载条效果js进度加载条效果不一样的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android自定义webView头部进度加载效果、ASP.NET实现进度条效果、C#实现炫酷启动图-动态进度条效果、css 实现炫酷的条纹进度条效果等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

JS进度加载条效果(js进度加载条效果不一样)

JS进度加载条效果(js进度加载条效果不一样)

1、NProgress.js

这是一个基于JQuery的插件,轻量级的ajax进度条应用。

// 通过clone文件下来,导出NProgress.css和NProgress.js文件
<script src=''nprogress.js''></script>
<link rel=''stylesheet'' href=''nprogress.css''/>

// 或者NPM
npm install --save nprogress

// 或者CDN
https://unpkg.com/nprogress@0.2.0/nprogress.js
https://unpkg.com/nprogress@0.2.0/nprogress.css

// 进度条开始结束
NProgress.start();
NProgress.done();

// 百分比:通过设置progress的百分比,调用 .set(n)来控制进度,其中n的取值范围为0-1
NProgress.set(0.0);

2、Pace.js

这是一个非常有意思的加载框架

参考文献

// 通过clone文件下来,导出Pace.js文件,和在themes文件夹中选择一种loading动画效果
// 在head里面引入文件,引入即可,无需再配置其他
<link rel="stylesheet" href="/pace/themes/blue/pace-theme-center-atom.css">
<script src="/pace/pace.js"></script>
    
// 自定义配置
paceOptions = {
    ajax: false, // disabled
    document: false, // disabled
    eventLag: false, // disabled
    elements: {
    selectors: [''.mytest'']
  }
};

// API
Pace.start:开始显示进度条,如果你不是使用AMD或者Browserify来加载模块的话,这个会默认执行。
Pace.restart:进度条重新加载以及显示。
Pace.stop:隐藏进度条以及停止加载。
Pace.track:监测一个或者多个请求任务。
Pace.ignore:忽略一个或者多个请求任务

// 调用API
Pace.on(''event'', ''fu()'')
    
// 重新加载
Pace.restart()
    
// pace.js进度条插件无法通过ajax启动的解决办法
$(document).ajaxStart(function() { Pace.restart(); });

3、Nanobar.js

非常非常轻量级的进度条,压缩过后仅有730字节。不需要引入jQuery

npm install nanobar

// 引入
<script src="path/to/nanobar.js"></script>
    
// 启动
var nanobar= new Nanobar(options);

// options参数
var options = {
    	bg <String>:(可选)CSS背景颜色属性,默认为”#000″即黑色。
		id <String>:(可选)nanobar的div的id
		target <DOM Element>:设置防止进度条HTML代码的位置,若target为空则会固定到document的顶部位置
	}

// 进度运动
nanobar.go(percentage):调整进度
percentage <Number>:nonabar的百分比,取值为0-100

Android自定义webView头部进度加载效果

Android自定义webView头部进度加载效果

不多说先来看下效果图:

1. 颜色渐变加载进度条(夜神模拟器)

这里写图片描述

 

绿色加载进度条(魅蓝note2)

这里写图片描述

 

看图说话:

上图是不是加载网页的时候会有一个进度条在横向加载,比以前网速不好的时候是一片空白给人的感觉友好多了是不,然后效果还不错。

实现思路

就是自己画一条进度线(大家应该都会吧)然后加载到WebView的上面,开始进度条是隐藏的,进度线初始值为1,然后为了效果好一点,初始少于10的进度都让它加载到10的位置,等进度到100的时候0.2秒后隐藏。

请记得添加网络权限:

 <uses-permission android:name="android.permission.INTERNET" />

说多了都是泪 ,快吃晚饭了,直接代码说话:

代码讲解

步骤一:我们先来话进度线

#WebViewProgressBar.java
package com.losileeya.materialprogresswebview.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import com.losileeya.materialprogresswebview.R;
/**
 * User: Losileeya (847457332@qq.com)
 * Date: 2016-04-24
 * Time: 14:43
 * 类描述:自定义进度条
 *
 * @version :
 */
public class WebViewProgressBar extends View {
  private int progress = 1;//进度默认为1
  private final static int HEIGHT = 5;//进度条高度为5
  private Paint paint;//进度条的画笔
 // 渐变颜色数组
 private final static int colors[] = new int[]{0xFF7AD237,0xFF8AC14A,0x35B056 }; //int类型颜色值格式:0x+透明值+颜色的rgb值
  public WebViewProgressBar(Context context) {
    this (context,null);
  }
  public WebViewProgressBar(Context context,AttributeSet attrs) {
    this(context,attrs,0);
  }
  public WebViewProgressBar(Context context,AttributeSet attrs,int defStyleAttr) {
    super(context,defStyleAttr);
    initPaint(context);
  }
  private void initPaint(Context context) {
    //颜色渐变从colors[0]到colors[2],透明度从0到1
//    LinearGradient shader = new LinearGradient(
//        0,//        100,HEIGHT,//        colors,//        new float[]{0,0.5f,1.0f},//        Shader.TileMode.MIRROR);
    paint=new Paint(Paint.DITHER_FLAG);
    paint.setStyle(Paint.Style.stroke);// 填充方式为描边
    paint.setstrokeWidth(HEIGHT);//设置画笔的宽度
    paint.setAntiAlias(true);// 抗锯齿
    paint.setDither(true);// 使用抖动效果
paint.setColor(context.getResources().getColor(R.color.primary_light));//画笔设置颜色
//    paint.setShader(shader);//画笔设置渐变
  }
  /**
   * 设置进度
   * @param progress 进度值
   */
  public void setProgress(int progress){
    this.progress = progress;
    invalidate();//刷新画笔
  }
  @Override
  protected void onDraw(Canvas canvas) {
   canvas.drawRect(0,getWidth() * progress / 100,paint);//画矩形从(0.0)开始到(progress,height)的区域
  }
}

上面代码的功能就是画一条线(颜色可渐变也可不变色),暴露设置进度的方法给使用者,然后调用 invalidate()刷新进度。

注意:使用渐变时数组的长度和透明度数组长度必须一致,否则会报错的

步骤二:自定义封装webView

#ProgressWebView.java
package com.losileeya.materialprogresswebview.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
/**
 * User: Losileeya (847457332@qq.com)
 * Date: 2016-04-24
 * Time: 14:42
 * 类描述:自定义带进度加载条的webView
 *
 * @version :
 */
public class ProgressWebView extends WebView {
  private WebViewProgressBar progressBar;//进度条的矩形(进度线)
  private Handler handler;
  private WebView mWebView;
  public ProgressWebView(Context context,AttributeSet attrs) {
    super(context,attrs);
    //实例化进度条
    progressBar = new WebViewProgressBar(context);
    //设置进度条的size
    progressBar.setLayoutParams(new ViewGroup.LayoutParams
        (ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT));
    //刚开始时候进度条不可见
    progressBar.setVisibility(GONE);
    //把进度条添加到webView里面
    addView(progressBar);
    //初始化handle
    handler = new Handler();
    mWebView = this;
    initSettings();
  }
  private void initSettings() {
    // 初始化设置
    WebSettings mSettings = this.getSettings();
    mSettings.setJavaScriptEnabled(true);//开启javascript
    mSettings.setDomStorageEnabled(true);//开启DOM
    mSettings.setDefaultTextEncodingName("utf-8");//设置字符编码
    //设置web页面
    mSettings.setAllowFileAccess(true);//设置支持文件流
    mSettings.setSupportZoom(true);// 支持缩放
    mSettings.setBuiltInZoomControls(true);// 支持缩放
    mSettings.setUseWideViewPort(true);// 调整到适合webview大小
    mSettings.setLoadWithOverviewmode(true);// 调整到适合webview大小
    mSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);// 屏幕自适应网页,如果没有这个,在低分辨率的手机上显示可能会异常
    mSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
    //提高网页加载速度,暂时阻塞图片加载,然后网页加载好了,在进行加载图片
    mSettings.setBlockNetworkImage(true);
    mSettings.setAppCacheEnabled(true);//开启缓存机制
    setWebViewClient(new MyWebClient());
    setWebChromeClient(new MyWebChromeClient());
  }
  /**
   * 自定义WebChromeClient
   */
  private class MyWebChromeClient extends WebChromeClient {
    /**
     * 进度改变的回掉
     *
     * @param view    WebView
     * @param newProgress 新进度
     */
    @Override
    public void onProgressChanged(WebView view,int newProgress) {
      if (newProgress == 100) {
        progressBar.setProgress(100);
        handler.postDelayed(runnable,200);//0.2秒后隐藏进度条
      } else if (progressBar.getVisibility() == GONE) {
        progressBar.setVisibility(VISIBLE);
      }
      //设置初始进度10,这样会显得效果真一点,总不能从1开始吧
      if (newProgress < 10) {
        newProgress = 10;
      }
      //不断更新进度
      progressBar.setProgress(newProgress);
      super.onProgressChanged(view,newProgress);
    }
  }
  private class MyWebClient extends WebViewClient {
    /**
     * 加载过程中 拦截加载的地址url
     *
     * @param view
     * @param url 被拦截的url
     * @return
     */
    @Override
    public boolean shouldOverrideUrlLoading(WebView view,String url) {
      mWebView.loadUrl(url);
      return true;
    }
    /**
     * 页面加载过程中,加载资源回调的方法
     *
     * @param view
     * @param url
     */
    @Override
    public void onLoadResource(WebView view,String url) {
      super.onLoadResource(view,url);
    }
    /**
     * 页面加载完成回调的方法
     *
     * @param view
     * @param url
     */
    @Override
    public void onPageFinished(WebView view,String url) {
      super.onPageFinished(view,url);
      // 关闭图片加载阻塞
      view.getSettings().setBlockNetworkImage(false);
    }
    /**
     * 页面开始加载调用的方法
     *
     * @param view
     * @param url
     * @param favicon
     */
    @Override
    public void onPageStarted(WebView view,String url,Bitmap favicon) {
      super.onPageStarted(view,url,favicon);
    }
    @Override
    public void onReceivedError(WebView view,int errorCode,String description,String failingUrl) {
      super.onReceivedError(view,errorCode,description,failingUrl);
    }
    @Override
    public void onScaleChanged(WebView view,float oldScale,float newScale) {
      super.onScaleChanged(view,oldScale,newScale);
      ProgressWebView.this.requestFocus();
      ProgressWebView.this.requestFocusFromTouch();
    }
  }
  /**
  *刷新界面(此处为加载完成后进度消失)
  */
  private Runnable runnable = new Runnable() {
    @Override
    public void run() {
      progressBar.setVisibility(View.GONE);
    }
  };
}

上面的代码就是把进度线加到webView里面,然后自定义WebChromeClient通过重写onProgressChanged()方法调用 progressBar.setProgress(newProgress)来更新进度,进度到100时再隐藏,是不是思路很清晰,其他的就是一些webView的设置和封装这里都有清楚的注释,自己去看。

使用ProgressWebView加载网页

布局使用:

#activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<com.losileeya.materialprogresswebview.widget.ProgressWebView
 xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/webView"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
</com.losileeya.materialprogresswebview.widget.ProgressWebView>

布局看起来是不是很清爽,对了,要的就是之效果:

实际使用也很简单:

#MainActivity.java
package com.losileeya.materialprogresswebview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.losileeya.materialprogresswebview.widget.ProgressWebView;
public class MainActivity extends AppCompatActivity {
  //ProgressWebView
  private ProgressWebView mWebView;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mWebView = (ProgressWebView) findViewById(R.id.webView);//findViewById webView
    mWebView.loadUrl("http://blog.csdn.net/u013278099/");//加载网址
    mWebView.setFocusable(true);//设置有焦点
    mWebView.setFocusableInTouchMode(true);//设置可触摸
  }
}

总结

以上所述是小编给大家介绍的Android自定义webView头部进度加载效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

ASP.NET实现进度条效果

ASP.NET实现进度条效果

我们先看下进度条效果

我点击了按钮后他会显示进度页面,进度完成后,进度条消失,其实也是比较简单的了。

我们需要一个进度条代码文件ProgressBar.htm(注意:是没有head这些标签的)

<script language="javascript">
  function SetPorgressBar(pos) {
    //设置进度条居中

    var screenWidth = document.body.offsetWidth;
    ProgressBarSide.style.width = Math.round(screenWidth / 2) + "px";
    ProgressBarSide.style.left = Math.round(screenWidth / 4) + "px";
    ProgressBarSide.style.top = "50px";
    ProgressBarSide.style.height = "21px";
    ProgressBarSide.style.display = "block";

    //设置进度条百分比 
    ProgressBar.style.width = pos + "%";
    ProgressText.innerHTML = pos + "%";
  }

  function SetMaxValue(maxValue) {
    ProgressBarSide.style.width = maxValue + "px";
  }

  //完成后隐藏进度条
  function SetCompleted() {
    ProgressBarSide.style.display = "none";
  }

  function SetTitle(title) {
    ProgressTitle.innerHTML = title;
  }
</script>
<div id="ProgressBarSide">
  <div id="ProgressBar">
  </div>
  <div id="ProgressText">
  </div>
  <div id="ProgressTitle">
  </div>
</div>

然后需要一个进度条类ProgressBar.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;

namespace ZhuoYueE.Dop.Web.UI
{
  /// <summary>
  ///显示进度条
  /// </summary>
  public class ProgressBar : System.Web.UI.Page
  {
    /// <summary>
    /// 最大值
    /// </summary>
    private int MaxValue
    {
      get
      {
        if (ViewState["MaxValue"] == null)
        {
          return 0;
        }
        else
        {
          return Convert.ToInt32(ViewState["MaxValue"]);
        }
      }
      set
      {
        ViewState["MaxValue"] = value;
      }
    }
    /// <summary>
    /// 当前值
    /// </summary>
    private int ThisValue
    {
      get
      {
        if (ViewState["ThisValue"] == null)
        {
          return 0;
        }
        else
        {
          return Convert.ToInt32(ViewState["ThisValue"]);
        }
      }
      set
      {
        ViewState["ThisValue"] = value;
      }
    }
    /// <summary>
    /// 当前页面
    /// </summary>
    System.Web.UI.Page m_page;
    /// <summary>
    /// 功能描述:构造函数
    /// 作  者:huangzh
    /// 创建日期:2016-05-06 11:54:34
    /// 任务编号:
    /// </summary>
    /// <param name="page">当前页面</param>
    public ProgressBar(System.Web.UI.Page page)
    {
      m_page = page;
    }

    public void SetMaxValue(int intMaxValue)
    {
      MaxValue = intMaxValue;
    }

    /// <summary>
    /// 功能描述:初始化进度条
    /// 作  者:huangzh
    /// 创建日期:2016-05-06 11:55:26
    /// 任务编号:
    /// </summary>
    public void InitProgress()
    {
      //根据ProgressBar.htm显示进度条界面
      string templateFileName = AppDomain.CurrentDomain.BaseDirectory + "ProgressBar.htm";
      StreamReader reader = new StreamReader(@templateFileName, System.Text.Encoding.GetEncoding("GB2312"));
      string strhtml = reader.ReadToEnd();
      reader.Close();
      m_page.Response.Write(strhtml);
      m_page.Response.Flush();
    }

    /// <summary>
    /// 功能描述:设置标题
    /// 作  者:huangzh
    /// 创建日期:2016-05-06 11:55:36
    /// 任务编号:
    /// </summary>
    /// <param name="strTitle">strTitle</param>
    public void SetTitle(string strTitle)
    {
      string strjsBlock = "<script>SetTitle(''" + strTitle + "''); </script>";

      m_page.Response.Write(strjsBlock);
      m_page.Response.Flush();
    }

    /// <summary>
    /// 功能描述:设置进度
    /// 作  者:huangzh
    /// 创建日期:2016-05-06 11:55:45
    /// 任务编号:
    /// </summary>
    /// <param name="percent">percent</param>
    public void AddProgress(int intpercent)
    {
      ThisValue = ThisValue + intpercent;
      double dblstep = ((double)ThisValue / (double)MaxValue) * 100;

      string strjsBlock = "<script>SetPorgressBar(''" + dblstep.ToString("0.00") + "''); </script>";

      m_page.Response.Write(strjsBlock);
      m_page.Response.Flush();
    }


    public void DisponseProgress()
    {
      string strjsBlock = "<script>SetCompleted();</script>";
      m_page.Response.Write(strjsBlock);
      m_page.Response.Flush();
    }
  }
}

然后就是调用方法了,调用很简单,在页面的按钮事件或者其他什么地方加入代码,如在按钮事件里这么用

protected void btnImport_Click(object sender, EventArgs e)
    {
      ProgressBar pb = new ProgressBar(this);
      pb.SetMaxValue(110);
      pb.InitProgress();
      pb.SetTitle("这是一个测试数据");
      for (int i = 1; i <= 110; i++)
      {
        pb.AddProgress(1);
        //此处用线程休眠代替实际的操作,如加载数据等
        System.Threading.Thread.Sleep(50);
      }
      pb.DisponseProgress();
    }

怎么样,是不是很简单呢。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:
  • Asp.net基于ajax和jquery-ui实现进度条
  • asp.net mvc 实现文件上传带进度条的思路与方法
  • asp.net文件上传带进度条实现案例(多种风格)
  • asp.net单文件带进度条上传的解决方案
  • Asp.Net 无刷新文件上传并显示进度条的实现方法及思路
  • asp.net 生成静态页时的进度条显示
  • 利用Asp.Net回调机制实现进度条
  • ASP.NET技巧:教你制做Web实时进度条
  • ASP.NET MVC使用jQuery ui的progressbar实现进度条

C#实现炫酷启动图-动态进度条效果

C#实现炫酷启动图-动态进度条效果

一、简述

最近接到一个新需求,让做一个动效进度条。

由于我们的产品比较大,在软件启动的时候会消耗比较长的时间,原生的进度条已经不能满足我们的需求,这里我们就需要一个会动的进度条,效果如下图所示。

光效进度条主要是做了一个进度动画,在已完成的部分上进行快速的迭代渲染,给用户一种直观感受,我们的软件一直努力加载,它还活着。

有了这个进度条之后,当我们的进度从40%到50%这个持续的过程中,界面再也不会出现假死的情况,是不是很完美呢。。。

下面我就来分析下这个动效进度条是怎么做的

二、动效进度条

如效果图所示,光效进度条不同于一般的进度条,他在基础的任务进度之上还添加了一层光效,主要是想告诉用户我们的软件一直在努力运行,请在耐心的等待一下下。

我自己在做功能的时候,往往喜欢先做一个测试demo,然后在把做好的功能集成在正式环境,这个功能也不列外,如第一节中展示的效果图,就是测试demo的样子,虽然很丑,但是基础功能是有的。

现在的很多软件,在进度展示上都有了比较绚丽的效果,比如压缩软件,解压文件的时候都会有动效进度条,用过的同学应该都知道长啥样,而我们的光效进度条跟这个效果差不多,除此之外我们还提供了另一种动效,延迟动效,他们两个在一定程度上都展示了更友好的进度效果。

在开始分析功能前,首先我们先来考虑下我们的需求:动效进度条,也就是说在原来的进度条基础上需要添加实时动画,让进度条看起来更炫酷一些,除了光效进度条以外,还有一种延迟到达进度条,也属于动态进度条。

延迟动效、说直白一点儿就是延迟到达,当我们设置了进度从10%到20%时,程序模拟了一个渐进的过程,使用一个时间段走完了这10%的进度。

下面我们分别来介绍这两种进度条的实现

实现炫酷的进度条我们可以从QWidget自定义开始写,也就是说从头开始写,但通常我们不这样干,因为这样可能会写出无穷无尽的bug,而且现有的轮子已经很稳定了,为什么还要造呢。

1、光效进度条

光效进度条我们使用了一个小技巧,采用一个简单的办法实现,我们的光效进度条控件继承自Qt原生进度条类QProgressBar,在新类中我们只需要在Qt绘制完原生进度条之后,补画动效即可。

a、paintEvent函数

paintEvent函数是Qt的绘制函数,当界面刷新的时候,这个接口函数就会被调用,因此我们需要重写这个接口,首先调用父窗口的绘制方法,然后我们在绘制我们自己的动效,代码如下所示

QProgressBar::paintEvent(event);
drawCache绘制动效

b、drawCache绘制动效

绘制动效的时候,我们需要知道动效的绘制区域,这个地方我们需要主动去解析qss的一些参数,Qt的style()->subElementRect这个接口刚好可以拿到我们需要的信息

下面简单描述下我们的实现流程

•首先我们获取进度条的几何大小和中间进度的几何大小,这样的话我们就可以计算出来各border的数值
•然后根据我们当前的value值就可以计算出进度条已经走过(就是值小于我们设定的区域)的几何大小
•我们的光效将是跑在第二步计算出来的区域上,一直循环迭代
•内存里我们维护一个cacheValue,这个值在每次界面刷新的时候递增,但是不能大于第二步的value值,cacheValue将是我们动效绘制的一个关键参数,他表示了动效绘制的长度
•构造一个渐变刷子,设置给QPainter
•绘制动效

上下大致描述了下绘制动效的一个流程,下面送上具体代码,由于篇幅原因,代码我进行了部分伪代码处理。

void GMPProgressBar::drawCache()
{
 QStyleOptionProgressBarV2 opt;
 QRect outerRect = style()->subElementRect(QStyle::SE_ProgressBarGroove, &opt, this);
 QRect innerRect = style()->subElementRect(QStyle::SE_ProgressBarContents, &opt, this);
 QMargins borders(构造一个QMargins);

    QRectF rect(动效绘制区域);

 if (m_iCacheValue != 0)
 {
  QPainter painter(this);
  QLinearGradient gradient(构造绘图刷子);
  painter.setBrush(gradient);
  painter.drawRoundedRect(rect, 2, 2);
 }
}

c、定时刷新

由于我们的动效是需要主动去刷新的,因此我们需要声明一个定时器,然后定时去刷新,实现代码可能像下面这样

connect(m_pCacheTimer, &QTimer::timeout, this, [this]{
  if (TM_CACHE == m_mode)
  {
   ++m_iCacheValue;
   repaint();
  }else
  {
   m_pCacheTimer->stop();
  }
 });

定时器只需要在我们第一次设置进度条值的时候启动,或者当我们设置一个新的值,而定时器没有启动,我们就需要去激活定时器。

TM_CACHE模式即是我们的动效模式,TM_SMOOTH模式则是我们的延迟到达模式

connect(this, &QProgressBar::valueChanged, [this](int value){//TM_CACHE模式下 启动动画时机
  if (!m_pCacheTimer->isActive() && value != 0 && TM_CACHE == m_mode)
  {
   m_pCacheTimer->start(m_iRefreshleveling);
  }
 });

动效进度条效果如下图所示

2、延迟到达进度条

动效进度条可能更适用于启动界面,但是也有一些时候,我们可能需要更平缓的一个加载曲线,例如安装软件、卸载软件的时候。

a、setValue

延迟到达进度条和动效进度条的实现方式就有所差别了,对于实现延迟到达进度条,我们这里重写了setValue函数,当外部调用该接口设置value值时,我们并没有立即去设置当前值,而是使用了一个时间段去完成这个值得刷新。

•外部调用setValue时,我们首先计算出我们应该绘制的最大宽度PixelMax、当前已经绘制到的最大宽度cacheValue和我们的步长
•设置定时器刷新频率,并重启定时器
•定时器刷新时,cacheValue自增我们的步长
•调用父类的QProgressBar::setValue接口设置值

b、定时器

延迟达到功能的的定时器和之前我们什么的动效定时器可以混用一个,我们定时器刷新的时候,针对不同的动画模式,我们执行不同的的代码即可,实现代码可能像下面这样

connect(m_pCacheTimer, &QTimer::timeout, this, [this]{
 if (TM_CACHE == m_mode)
 {
  ++m_iCacheValue;
  repaint();
 }
 else if (TM_SMOOTH == m_mode)
 {
  changeSmooth();
 }
 else
 {
  m_pCacheTimer->stop();
 }
});

延迟到达进度条效果如下图所示

3、接口说明

光效进度条类对外只暴露了3个接口,分别是设置动画模式、动画时长和刷新频率

特别需要注意的是,我们这里重写了父类的setValue接口,这意味着我们不能使用多态来操作这个接口

void setTransitionMode(TransitionMode mode);//设置动画模式
void setSmoothDuration(int duration);//设置刷新总时长 模式为TM_SMOOTH时有效
void setRefreshleveling(int rate);//设置刷新频率 每次更改TransitionMode之后会变为默认值

a、修改动画模式

修改动画模式的时候,我们需要清空内存中的所有数据,并把value值设为0。

void GMPProgressBar::setTransitionMode(TransitionMode mode)
{
 if (m_mode == mode)
 {
  return;
 }
 m_mode = mode;
 clearData();
 QProgressBar::setValue(0);
}

b、其他接口

设置刷新时长和频率接口都比较简单,不做特别说明

特别注意:这个3个接口最好是在动画启动前设置,动画开始后尽量不要去调用

三、启动图

第二节我们主要是讲述了怎么做一个动效进度条,这一节我们来做一个启动图页面,把这个动效使用进去。

启动图不是我们主要分析的内容,这个我就简单说下这个类的实现方式和一些借口说明

1、实现思路

Qt已经给我们提供了一个QSplashScreen,但是使用起来还是特别有限,因此这里我把Qt的源码直接进行了二次开发

•首先Qt的原生实现方式基本都被移植了出来
•启动图使用了简单的上下布局,上面是一张我自绘制的图片,放在了一个QLabel上,下面是动效进度条
•自绘制的图片上包括了,产品名称、logo、背景图等等

2、背景图切换

当我们调用setPixmap设置背景图时,如果我们指定了多张图,我将会启动一个定时器,在指定时长后重新构造一张大的背景图,并添加到启动窗口上

这里主要说明下背景图是怎么构造出来的,代码如下所示

a、根据背景图构造启动图大小,并移动到屏幕中间

m_currentPixmap = m_lstPixmaps.at(m_iCurrentIndex);
QRect size(QPoint(), m_currentPixmap.size() / m_currentPixmap.devicePixelRatio());
size.setHeight(size.height() + StatusBarHeight);
setFixedSize(size.size());
m_pProgressBar->setFixedWidth(size.width() / 8 * 3);
move(QApplication::desktop()->screenGeometry().center() - size.center());

b、绘制程序logo

QPainter painter(&m_currentPixmap);
painter.drawPixmap(m_startPos, m_logo);

c、绘制标题栏

painter.save();
painter.setFont(m_titleFont);
QFontMetrics fontMetrics(m_titleFont);
int textWidth = fontMetrics.width(m_strWindowTitle);
int textHegith = m_logo.height();
QRect textTect = QRect(m_startPos + QPoint(13 + m_logo.width(), 0), QSize(textWidth, textHegith));
painter.drawText(textTect, m_strWindowTitle, QTextOption(Qt::AlignCenter));
painter.restore();

d、设置给QLabel背景图

m_pWindowBackground->setPixmap(m_currentPixmap);

启动图的效果这里就不在贴图了,第三节上的两个gif图都是最终的启动图效果

四、测试

最后就是测试代码了,主要是模拟了程序的一个加载过程

1、构造启动图

首先我们构造一个启动图对象,并设置程序logo和动画模式

GMPSplashScreen * screen = new GMPSplashScreen(QPixmap(":/splashScreen/start.png"));
screen->show();
screen->setLogo(QIcon("logo.ico").pixmap(48, 48));
screen->setTransitionMode(GMPProgressBar::TM_CACHE);

2、背景图

设置背景图,并设置背景图更换时间间隔

QList<QPixmap> lstPixmap;
lstPixmap.append(QPixmap(":/splashScreen/start.png"));
lstPixmap.append(QPixmap(":/splashScreen/start.jpg"));
screen->setPixmap(lstPixmap, 2000);

3、其他信息

设置程序的提示信息和标题栏

screen->showMessage("Established connections", 0);
screen->setTitle(QStringLiteral("广联达BIM土建计量GTJ2018"));

4、事件循环

这里写了一个死循环,主要是为了模拟程序的一个加载过程,每隔10ms处理下界面刷新事件

a.processEvents();
while (1)
{
 QTest::qSleep(10);
 a.processEvents();
}
splashScreen w;
w.show();
screen->finish(&w);

总结

以上所述是小编给大家介绍的C#实现炫酷启动图-动态进度条效果,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

您可能感兴趣的文章:
  • C#使用winform实现进度条效果
  • Winform 实现进度条弹窗和任务控制
  • C# Winform下载文件并显示进度条的实现代码
  • c#进度条 progressBar 使用方法的小例子
  • asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)
  • c#根据文件大小显示文件复制进度条实例
  • C#实现带百分比的进度条功能示例
  • C#中常使用进度条的代码
  • C#实现带进度条的ListView
  • C# Winform实现进度条显示

css 实现炫酷的条纹进度条效果

css 实现炫酷的条纹进度条效果

css 实现炫酷的条纹进度条效果

原创2022-06-14 16:47·前端石三

效果图:

css 实现炫酷的条纹进度条效果

 

html:

<!--进度条-->
<div>
  <div>
    <div></div>
  </div>
  <span>60%</span>
</div>
css:

 /*进度条*/
  .progress-wrap {
    width: 100%; 
    height: 12px;
    border-radius: 8px;
    position: relative; 
  }
  .progress-wrap span{
    position:absolute;
    left:50%;
    top:-20px;
    color:#000;
  }
  /*进度条底层背景样式*/
  .progress-inner {  
    height: inherit;
    background: rgb(142 193 255 / 20%); 
    border-radius: 8px;
  }
  /*进度层样式效果,使用动画效果*/
  .progress-nums {
    width: 60%; 
    height: inherit;
    border-radius: 6px; 
    background: repeating-linear-gradient(-45deg, #008bdd 25%, #49beff 0, #49beff 50%, #008bdd 0, #008bdd 75%, #49beff 0);
    background-size: 16px 16px;
    animation: panoramic 30s linear infinite;
  }
  /*定义动画*/
  @keyframes panoramic{
    to {
      background-position: 200% 0;
    }
  }
 

总结

以上是小编为你收集整理的css 实现炫酷的条纹进度条效果全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

原文地址:https://www.cnblogs.com/sexintercourse/p/16386843.html

关于JS进度加载条效果js进度加载条效果不一样的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android自定义webView头部进度加载效果、ASP.NET实现进度条效果、C#实现炫酷启动图-动态进度条效果、css 实现炫酷的条纹进度条效果的相关知识,请在本站寻找。

本文标签: