`
lindexi-gd
  • 浏览: 140021 次
社区版块
存档分类
最新评论

Xamarin Forms 进度条控件

 
阅读更多

本文翻译:http://xamlnative.com/2016/04/14/xamarin-forms-a-simple-circular-progress-control/ 里面都是胡说的,如果看不懂可以联系邮箱

源代码:https://github.com/billreiss/xamlnative/tree/master/XamarinForms/CircularProgress

最近作者需要做一个简单的圆形的等待控件在一个Xamarin Forms应用,效果可以看

这里写图片描述

看起来很容易做,不知道怎么微软就没有弄个这么好看,微软没有,我们来直接做,看起来这个很简单

原来的进度条是一个线,没有UWP那个ring,我要做一个,可以使用本地控制、自定义渲染器渲染、使用组件里面弄很多我之前做的、到Nuget找,这些都觉得不是我要的。

看到他们没有,我就很高兴,我可以做一个很厉害的,自然这里我是原文的那个,写了Xaml的大神

我首先拿出一个本子,我应该弄矢量图形,在Xamarin原生还没有,我会为每个平台定制渲染,所以他不支持我不能使用,我想到使用图片,矢量图片,既然想要图片我如何让很多图片看起来是一个

这里写图片描述

我想到简单使用两图,实际对称两图是表示4图,不停覆盖的两个图片表示进度,两个图片颜色不同

这里写图片描述

这里写图片描述

图片可以在:https://github.com/billreiss/xamlnative/tree/master/XamarinForms/CircularProgress/CircularProgress/CircularProgress.Droid/Resources/drawable

两个保存格式Png图片,一个图表示0-50%,我们叫第一图“completed”,第二“pending”,颜色深的是第一,进度我们需要一个completed,两个pending,我们先放completed,然后在它上面放pending,在pending对面放pending,第一个图在代码叫“progress1”,第二“background1”,第二个覆盖第一个,第三个pending旋转180,总的一个蓝色圆,这是0%

这里写图片描述

25%:我们旋转pending第二个,可以让看到下面的图,这个我们覆盖原来的pending因为颜色一样,所以我们就可以看到25%

这里写图片描述

50%:我们需要改变,两个completed,一个pending,pending覆盖completed,但是只是覆盖一个,他们的层次:

  • completed
  • pending
  • completed

可以让pending覆盖右边的completed,超过50%让pending右旋

如果觉得上面说的还是不知道,可以看代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace CircularProgress
{
    public class CircularProgressControl : Grid
    {
        View progress1;
        View progress2;
        View background1;
        View background2;
        public CircularProgressControl()
        {
            progress1 = CreateImage("progress_done");
            background1 = CreateImage("progress_pending");
            background2 = CreateImage("progress_pending");
            progress2 = CreateImage("progress_done");
            HandleProgressChanged(1, 0);
        }

        private View CreateImage(string v1)
        {
            var img = new Image();
            img.Source = ImageSource.FromFile(v1 + ".png");
            this.Children.Add(img);
            return img;
        }

        public static BindableProperty ProgressProperty =
    BindableProperty.Create("Progress", typeof(double), typeof(CircularProgressControl), 0d, propertyChanged: ProgressChanged);

        private static void ProgressChanged(BindableObject bindable, object oldValue, object newValue)
        {
            var c = bindable as CircularProgressControl;
            c.HandleProgressChanged(Clamp((double)oldValue, 0, 1), Clamp((double)newValue, 0, 1));
        }

        static double Clamp(double value, double min, double max)
        {
            if (value <= max && value >= min) return value;
            else if (value > max) return max;
            else return min;
        }

        private void HandleProgressChanged(double oldValue, double p)
        {
            if (p < .5)
            {
                if (oldValue >= .5)
                {
                    // this code is CPU intensive so only do it if we go from >=50% to <50%
                    background1.IsVisible = true;
                    progress2.IsVisible = false;
                    background2.Rotation = 180;
                    progress1.Rotation = 0;
                }
                double rotation = 360 * p;
                background1.Rotation = rotation;
            }
            else
            {
                if (oldValue < .5)
                {
                    // this code is CPU intensive so only do it if we go from <50% to >=50%
                    background1.IsVisible = false;
                    progress2.IsVisible = true;
                    progress1.Rotation = 180;
                }
                double rotation = 360 * p;
                background2.Rotation = rotation;
            }
        }

        public double Progress
        {
            get { return (double)this.GetValue(ProgressProperty); }
            set { SetValue(ProgressProperty, value); }
        }
    }
}

我们需要把图片放在不同平台的文件夹,ios放在Resources文件夹,Android放在 AndroidResource

我们把控件放MainPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="CircularProgress.MainPage"
             xmlns:local="clr-namespace:CircularProgress" BackgroundColor="White">
  <Grid>
    <local:CircularProgressControl x:Name="progressControl" Progress="0" HorizontalOptions="Center" VerticalOptions="Center" WidthRequest="60" HeightRequest="60"/>
  </Grid>
</ContentPage>

我们让time进度加0.1每0.02s

namespace CircularProgress
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            Xamarin.Forms.Device.StartTimer(TimeSpan.FromSeconds(.02), OnTimer);
        }

        private bool OnTimer()
        {
            var progress = (progressControl.Progress + .1) ;
            if (progress > 1) progress = 0;
            progressControl.Progress = progress;
            return true;
        }
    }
}

不使用自定义渲染,可以在各个平台没有使用厉害的技术覆盖两个图做出从0-100%,可以使用不同角度表示0.001

本文:http://blog.csdn.net/lindexi_gd

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    Xamarin-Forms-UI-Library:免费的Xamarin Forms UI库

    这个“Xamarin.Forms-UI-Library”可能包含了各种常见的UI组件,如自定义的按钮、滑块、进度条、选择器等。每个组件都可能有配套的XAML标记和C#代码,以及详细的使用说明。 **学习和使用建议** - 先了解Xamarin....

    Xamlly:Xamlly是Xamarin.Forms的控件库,完全用XAML编写

    Xamlly Xamlly是Xamarin.Forms的控件库,完全用XAML(或声明性代码)编写。 它旨在提供美观的控件,而无需编写自定义渲染器。 当前,该库具有以下控件: 在XAML文件中包括名称空间: xmlns:xamlly="clr-namespace:...

    Video-Player-Xamarin:用于演示在Xamarin Forms应用程序上播放视频的示例应用程序

    在 Xamarin.Forms 中没有内置的视频播放控件,所以我们通常需要使用自定义控件或第三方库来实现。这个示例可能使用了如 `FFmpegMediaMetadataRetriever` 或 `XamarinMediaManager` 这样的库,它们提供了跨平台的...

    forms-gtk-progress:Xamarin.Forms GTK后端进度

    "xamarin"和"xamarinforms"指的是Xamarin及其Xamarin.Forms框架,而"mono"是.NET框架的开源实现,用于跨平台开发。"linux"标签则明确了讨论的环境是在Linux上。 在名为"forms-gtk-progress-master"的压缩包中,可能...

    Xamarin-Forms-RadialProgress:Xamarin形式的径向规进度指示器

    通过学习和使用 "Xamarin.Forms-RadialProgress",开发者不仅可以掌握如何在 Xamarin.Forms 中创建自定义控件,还能深入理解 SkiaSharp 的图形绘制能力,这对于开发更复杂的 UI 功能和游戏是非常有用的。同时,这也...

    ProgressDemo.rar

    - 对于跨平台开发,如.NET Maui或Xamarin.Forms,也有相应的进度条控件。 - 在Web开发中,HTML5的`&lt;progress&gt;`标签可以创建进度条,JavaScript和CSS用于动态更新和样式控制。 7. 自定义样式与动画: - 开发者...

    AuroraControlsPlayground:Xamarin.Forms示例以显示Aurora Controls的主要功能

    Aurora Controls是一个UI控件库,为Xamarin.Forms开发者提供了丰富的自定义控件,以增强应用的用户界面和交互体验。 Xamarin.Forms是一个跨平台的UI工具包,允许开发人员使用C#和XAML创建原生移动应用程序,同时...

    gif手机登录界面进度条

    总之,创建一个"gif手机登录界面进度条"涉及到C#的UI设计、动画处理、进度条控件的使用,以及异步编程技术。开发者需要理解WPF或Xamarin.Forms的UI模型,掌握第三方库的应用,并能有效管理用户界面的交互逻辑。通过...

    xamarin.form 踩坑-本地视频播放_缩略图列表+播放界面_01

    在Xamarin.Forms中进行移动应用开发时,经常会遇到需要集成多媒体功能的需求,比如播放本地视频。"xamarin.form 踩坑-本地视频播放_缩略图列表+播放界面_01"这个标题揭示了一个开发者在实现这个功能时可能遇到的问题...

    xamarin.forms-busyindicator:SfBusyIndi​​cator入门样本

    为了增强用户体验,可以结合使用SfBusyIndicator与进度条控件(如SfProgressbar)。这样,用户不仅可以知道系统正忙,还可以看到任务的进度。 最后,同步fusion库提供了丰富的API和事件,使得SfBusyIndicator可以...

    PersonalFinanceSample:使用 Xamarin.Forms 4.8 预发布版探索形状和渐变

    【个人理财样本】是使用Xamarin.Forms 4.8预发布版开发的一个示例应用,主要展示了如何利用新增的形状和渐变画笔功能来增强用户界面的设计和体验。Xamarin.Forms是一个强大的跨平台UI工具包,允许开发者使用C#语言和...

    Xamrin Android开发实战 源代码

    1.3 开发Xamarin.Forms应用程序需要的工具 3 1.3.1 iOS应用程序 3 1.3.2 Android应用程序 3 1.3.3 Windows Phone应用程序 4 1.4 下载安装Xcode 4 1.4.1 申请苹果账号 4 1.4.2 Xcode的下载安装 8 1.5 下载安装...

    控件库

    3. **跨平台控件**:例如Qt、Xamarin.Forms或React Native,它们提供了能在多个平台上运行的统一控件。 对于开发者来说,理解基础控件库的工作原理和如何有效利用它们是提升开发效率和质量的关键。通过深入学习和...

    Xamarin-Audioplayer

    1. **Xamarin框架**:理解Xamarin的基本概念,包括Xamarin.Forms、Xamarin.Android和Xamarin.iOS,以及它们之间的关系和工作原理。学习如何创建跨平台项目,设置环境,编写和调试代码。 2. **C#编程**:作为Xamarin...

    Telerik_UI_for_Xamarin_2019_1_116_1_Dev_Downloadly.ir.msi.rar

    Telerik UI for Xamarin的核心价值在于其提供的高质量、本地化的UI控件,这些控件与Xamarin.Forms完全兼容,可帮助开发者实现一致的设计和体验,无论用户在哪个平台上使用应用。这个工具包包含了各种界面元素,如...

    KcmsChallengeAPP:样例领域NoSQL数据库APP

    此外,`Xamarin 社区工具包` 是一系列经过精心设计的 UI 控件和实用程序,为 Xamarin.Forms 开发者提供便利。这个工具包包括各种预封装的组件,如进度条、滑块、通知等,以及一些实用的扩展方法,帮助开发者加速应用...

    Bunifu_.NET_UI_Framework_1.5.3_Downloadly.ir.rar

    1. **跨平台支持**:Bunifu UI Framework 支持多种.NET平台,包括Windows Forms、WPF以及Xamarin,这意味着开发者可以利用同一个库创建跨平台的应用程序。 2. **丰富的控件集**:Bunifu Framework 包含了大量的...

    C#编写音乐播放器

    7. **界面设计**:提供友好的用户界面,包括播放按钮、音量滑块、进度条等控件。C#中的Windows Forms或WPF框架可以帮助我们构建这样的界面。 8. **音频效果**:高级的音乐播放器可能还包括均衡器、环绕声等音效调节...

    漂亮在线播放器

    而Windows Forms则更适合快速开发,提供了一套基本的控件和布局管理,适合初学者或小型项目。 对于在线播放功能,开发者通常会集成HTTP或RTSP协议来获取流媒体内容。C#中可以使用System.Net命名空间下的WebClient或...

    c#编写的播放器

    一个播放器的核心组件包括媒体文件的加载、播放、暂停、停止、快进、后退、音量控制以及进度条的显示。这些功能的实现主要依赖于Windows API(应用程序接口)和.NET Framework提供的多媒体类库。例如,System.Media...

Global site tag (gtag.js) - Google Analytics