IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 用C#写一个防安卓的属性动画 -> 正文阅读

[移动开发]用C#写一个防安卓的属性动画

定义独立动画接口

public interface IAnimator
{
        IAnimator Start();
        IAnimator Stop();
        IAnimator Reset();
        IAnimator SetDuration(int times);
        IAnimator SetNext(IAnimator next);
}

实现接口,创建值动画类

using Doraemon.Common.Utility;
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Doraemon.Common.Animation
{
    public class ValueAnimator<T> : IAnimator
    {
        private T start = default(T);
        private T end = default(T);
        private int times = 1000;
        private T curValue;
        private long ticks = 0;
        private IAnimator next = null;

        private Timer timer;

        public T CurValue
        {
            get => curValue;

            set
            {
                if ((IComparable)curValue != (IComparable)value)
                {
                    curValue = value;
                    Update?.Invoke(this, curValue);
                }
            }
        }

        public ValueAnimator(T start, T end)
        {
            CreateBase(start, end);
        }

        private void CreateBase(T start, T end)
        {
            this.start = start;
            this.end = end;
            timer = new Timer();
            timer.Enabled = false;
            timer.Interval = 10;
            timer.Tick += Timer_Tick;
        }

        public IAnimator Start()
        {
            timer.Start();
            return this;
        }

        public IAnimator Stop()
        {
            timer.Stop();
            return this;
        }

        public IAnimator Reset()
        {
            timer.Stop();
            CurValue = default(T);
            return this;
        }

        public event Handler<ValueAnimator<T>, T> Update;

        public event Handler<ValueAnimator<T>, T> Done;

        private List<string> strs = new List<string>();

        private void Timer_Tick(object sender, EventArgs e)
        {
            if (ticks == 0)
                ticks = SystemHelper.Ticks;
            double curRate = (SystemHelper.Ticks - ticks) / (times * 1000.0);
            double v1 = double.Parse(start.ToString());
            double v2 = double.Parse(end.ToString());
            
            bool reverse = (v2 - v1) < 0;
            double val = (v1 + (v2 - v1) * curRate);
            if ((!reverse && val >= v2)
                || (reverse && val <= v2))
            {
                CurValue = end;
                Stop();
                ticks = 0;
                Done?.Invoke(this, CurValue);
                if (next != null)
                    next.Start();
                
            }
            else
                CurValue = (T)Convert.ChangeType(val, typeof(T));
        }

        public IAnimator SetNext(IAnimator ani)
        {
            next = ani;
            return this;
        }

        public IAnimator SetDuration(int times)
        {
            this.times = times;
            return this;
        }
    }
}

实现对象属性动画

using System;
using System.Reflection;

namespace Doraemon.Common.Animation
{
    public class ObjectAnimator : IAnimator
    {
        private object obj = null;
        private string propertyName = string.Empty;
        private IAnimator animator;

        private ObjectAnimator(object obj, string propertyName, int start, int end)
        {
            this.obj = obj;
            this.propertyName = propertyName;
            var ani = new ValueAnimator<int>(start, end);
            this.animator = ani;
            ani.Update += Ani_Update;
        }
        private ObjectAnimator(object obj, string propertyName, double start, double end)
        {
            this.obj = obj;
            this.propertyName = propertyName;
            var ani = new ValueAnimator<double>(start, end);
            this.animator = ani;
            ani.Update += Ani_Update1;
        }

        private void Ani_Update1(ValueAnimator<double> sender, double e)
        {
            SetValue<double>(e);
        }

        private void SetValue<T>(T e)
        {
            try
            {
                Type t = this.obj.GetType();
                PropertyInfo pi = t.GetProperty(propertyName);
                pi.SetValue(this.obj, e);
            }
            catch
            {
                animator.Stop();
            }
        }

        private void Ani_Update(ValueAnimator<int> sender, int e)
        {
            SetValue<int>(e);
        }

        public static ObjectAnimator OfInt(object obj, string propertyName, int start, int end)
        {
            return new ObjectAnimator(obj, propertyName, start, end);
        }

        public static ObjectAnimator OfDouble(object obj, string propertyName, double start, double end)
        {
            return new ObjectAnimator(obj, propertyName, start, end);
        }

        public IAnimator Start()
        {
            return animator.Start();
        }

        public IAnimator Stop()
        {
            return animator.Stop();
        }

        public IAnimator Reset()
        {
            return animator.Reset();
        }

        public IAnimator SetDuration(int times)
        {
            return animator.SetDuration(times);
        }

        public IAnimator SetNext(IAnimator next)
        {
            return animator.SetNext(next);
        }
    }
}

应用

在WinForm中调用

         IAnimator ani1 = ObjectAnimator.OfDouble(this, "Opacity", 1, 0).SetDuration(200);
         IAnimator ani2 = ObjectAnimator.OfDouble(this, "Opacity", 0, 1).SetDuration(200);
         ani1.SetNext(ani2);
         ani2.SetNext(ani1);
         ani1.Start();

类安卓属性动画展示

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-08 13:55:57  更:2021-12-08 13:56:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:02:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码