gdip绘制加载动画

阿甘 19小时前 37

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=348;bottom=227)
winform.add(
plus={cls="plus";left=0;top=0;right=349;bottom=228;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/

//在前景里绘制动画:优化的现代加载动画
winform.plus.onDrawContent = function(graphics,rc,txtColor,rcContent,foreColor){
    if(owner.animationState===null) return;
    
    //创建画刷和画笔
    var primaryColor = 0xFF1890FF; //主色调
    var secondaryColor = 0xFFE6F7FF; //浅色背景
    
    var pen = gdip.pen(primaryColor, 5); //圆环画笔
    var bgPen = gdip.pen(secondaryColor, 5); //背景圆环画笔
    
    //计算中心点和半径
    var w,h = rc.width(),rc.height();
    var centerX, centerY = w/2, h/2;
    var radius = math.min(w, h) / 3; //圆环半径
    
    //绘制背景圆环
    graphics.drawEllipse(bgPen, centerX - radius, centerY - radius, 
        radius * 2, radius * 2);
    
    //绘制旋转的圆弧
    var startAngle = owner.animationState;
    var sweepAngle = 120; //圆环内弧长
    
    graphics.drawArc(pen, centerX - radius, centerY - radius, 
        radius * 2, radius * 2, startAngle, sweepAngle);
    
    //释放资源
    pen.delete();
    bgPen.delete();
}

//动画状态控制函数
winform.plus.onAnimation = function(state,beginning,change,timestamp,duration){
    // 使用线性动画确保流畅循环
    return beginning + change * (timestamp % duration) / duration;
}

//开始动画,参数:interval,beginning,change,duration
winform.plus.startAnimation(20,0,360,1000); //1秒转一圈

//悬浮控件窗口
winform.plus.orphanWindow(true);

winform.show();
win.loopMessage();
return winform;


做好后发现效果一般,百度一搜…看到了庆帝的加载动画:aardio - 制作启动等待动画窗口 高级

最新回复 (3)
  • 阿甘 19小时前
    0 2

    做加载动画的目的是:aardio + 多个 webview 的启动速度偏慢

    父窗口异步加载子窗口:

    showChildForm = function(){    
    	mainForm.plus2.text = "加载完成";    
    	mainForm.plus2.background = null;    
        mainForm.show(false);    
    }    
    closeMainForm = function(){    
        mainForm.close(true);    
    }    
    setMainFormTips = function(tips){    
    	mainForm.plus2.text = tips;    
    }
    thread.invoke(
        function(mainForm){    
    		var childForm = mainForm.loadForm("\dlg\childForm.aardio");    
    		childForm.show();    
        },mainForm    
    )


    在子窗口中调用:

    try{setMainFormTips("数据库初始化…");};// 告诉主窗口当前加载进度
    winform.onClose = function(hwnd,message,wParam,lParam){    
        try{closeMainForm();};// 用 try 是为了方便单独调试子窗口时不报错
    }


  • 阿甘 19小时前
    0 3
    阿甘 做加载动画的目的是:aardio + 多个 webview 的启动速度偏慢父窗口异步加载子窗口:showChildForm = function(){&nb ...
    子窗口加载过程中,会导致主窗口gdip绘制的动画变卡顿,所以就用了 gif 加载动画(虽然gif也会变卡顿,但比gdip好很多)
  • shzhbook 10小时前
    0 4
    感觉现有的加载等待方案都不是很理想。
返回