自定义ProgressBar,使window背景颜色不变暗

自定义进度对话框实现
本文介绍了如何在Android中自定义进度对话框样式,并通过代码实现了背景透明、无标题栏和关闭按钮的功能。

首先我们自定义style

<style name="CustomProgressDialog" parent="@style/CustomDialog">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:backgroundDimEnabled">false</item>
    </style>

android:windowBackground这个属性就是用来设置window的背景,这里用系统自带的透明就行了

自定义控件代码

package com.cattsoft.deliersystem.view;


import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.ProgressBar;
import android.widget.TextView;


import com.cattsoft.deliersystem.R;


public class ProgressDialog extends Dialog {
private Context context = null;
private static ProgressDialog customProgressDialog = null;
public ProgressDialog(Context context) {
super(context);
this.context = context;
}


public ProgressDialog(Context context, int theme) {
super(context, theme);
}


public static ProgressDialog createDialog(Context context) {
customProgressDialog = new ProgressDialog(context,
R.style.CustomProgressDialog);
//设置自定义的视图
customProgressDialog.setContentView(R.layout.dialog_view);
//设置ProgressBar在window上显示的位置
customProgressDialog.getWindow().getAttributes().gravity = Gravity.BOTTOM;
LayoutParams params = customProgressDialog.getWindow().getAttributes();
params.y = 370;
customProgressDialog.getWindow().setAttributes(params);
customProgressDialog.show();
return customProgressDialog;
}


public void onWindowFocusChanged(boolean hasFocus) {


if (customProgressDialog == null) {
return;
}
}


/**

* setTitile 标题

* @param strTitle
* @return

*/
public ProgressDialog setTitile(String strTitle) {
return customProgressDialog;
}


/**
* 设置ProgressBar是否显示

* @param bool
*/
public void setProgressBar(boolean bool) {
ProgressBar progressBar = (ProgressBar) customProgressDialog
.findViewById(R.id.progress);
if (bool) {
progressBar.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.GONE);
}
}


/**

* [setMessage 提示内容

* @param strMessage
* @return

*/
public ProgressDialog setMessage(String strMessage) {
TextView tvMsg = (TextView) customProgressDialog
.findViewById(R.id.id_tv_loadingmsg);


if (tvMsg != null) {
tvMsg.setText(strMessage);
}


return customProgressDialog;
}
}

题目2:创建一个自定义的进度条控件,它可以显示进度、支持颜色设置、支持动画效果,并且可以通过信号通知外部变化。 【要求】 1. 自定义控件: 1. 创建一个名为CustomProgressBar的类,继承自QWidget。该类应该实现以下功能: 2. 显示一个矩形进度条,表示进度。 3. 支持进度值的设置(0到100之间)。 4. 进度条应当在外部调用时自动更新显示的进度。 2. 颜色设置: 1. 进度条的颜色应根据进度动态变化。具体来说: 2. 当进度在0-50之间时,进度条应显示为红色。 3. 当进度在50-80之间时,进度条应显示为黄色。 4. 当进度在80-100之间时,进度条应显示为绿色。 5. 进度条背景可以设置为灰色(固定变)。 3. 支持动画效果: 1. 进度条应支持动画效果。当进度更新时,进度条的填充部分应平滑过渡,而是立即跳跃到新的进度值。 4. 信号与槽: 1. 当进度值发生变化时,控件应发出一个信号,通知外部应用当前的进度值。 2. 外部可以通过连接该信号到一个槽函数,以便在进度更新时做出相应的处理(例如,更新界面中的其他元素、触发动画等)。 5. 自定义属性: 1. 提供一个setProgress(int value)方法,用于外部设置进度值。确保值在0到100之间。 2. 提供一个setDuration(int duration)方法,用于设置动画效果的持续时间。 3. 提供一个setBarWidth(int width)方法,允许用户自定义进度条的宽度。 6. 事件处理: 1. 自定义控件应重写paintEvent(QPaintEvent *event)方法来绘制进度条。进度条的填充部分应该根据进度值、颜色和宽度来绘制。
最新发布
10-27
import os import sys import subprocess import tempfile import shutil from pathlib import Path # 尝试导入所需库,如果缺少则自动安装 try: import PySimpleGUI as sg from moviepy.editor import VideoFileClip except ImportError as e: print(f"缺少依赖库: {e}") print("正在尝试安装所需库...") # 安装依赖 subprocess.check_call([sys.executable, "-m", "pip", "install", "PySimpleGUI", "moviepy"]) # 重新导入 import PySimpleGUI as sg from moviepy.editor import VideoFileClip def resource_path(relative_path): """获取资源的绝对路径,用于PyInstaller打包后定位资源文件""" if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath("."), relative_path) def resize_video(input_path, output_path, width, height): """调整视频分辨率""" try: # 读取视频文件 video = VideoFileClip(input_path) # 调整分辨率 resized_video = video.resize(newsize=(width, height)) # 写入输出文件 resized_video.write_videofile( output_path, codec='libx264', audio_codec='aac', threads=4, preset='medium', ffmpeg_params=['-crf', '23'] # 控制视频质量 ) # 关闭视频对象 video.close() resized_video.close() return True, "成功调整视频分辨率!" except Exception as e: return False, f"处理视频时出错: {str(e)}" def main(): # 设置主题 - 使用 PySimpleGUI 5.0.10 兼容的方法 sg.theme('DarkBlue3') # 布局定义 layout = [ [sg.Text('输入视频文件:'), sg.Input(key='-INPUT-', enable_events=True), sg.FileBrowse(file_types=(("视频文件", "*.mp4 *.avi *.mov *.mkv *.flv *.wmv"),))], [sg.Text('输出文件夹:'), sg.Input(key='-OUTPUT_DIR-', enable_events=True), sg.FolderBrowse()], [sg.Text('输出文件名:'), sg.Input(key='-OUTPUT_NAME-', size=(30, 1))], [sg.HorizontalSeparator()], [sg.Text('目标分辨率:')], [sg.Text('宽度:'), sg.Input(key='-WIDTH-', size=(10, 1)), sg.Text('高度:'), sg.Input(key='-HEIGHT-', size=(10, 1))], [sg.Checkbox('保持宽高比', key='-KEEP_ASPECT-', default=False, enable_events=True)], [sg.HorizontalSeparator()], [sg.ProgressBar(100, orientation='h', size=(50, 20), key='-PROGRESS-', visible=False)], [sg.Text(key='-STATUS-', size=(60, 1))], [sg.Button('开始转换', key='-CONVERT-', disabled=True), sg.Button('退出')] ] # 创建窗口 window = sg.Window('视频分辨率强制拉伸工具', layout, finalize=True) # 事件循环 original_width, original_height = None, None while True: event, values = window.read() if event in (sg.WIN_CLOSED, '退出'): break elif event == '-INPUT-': # 当选择输入文件时,尝试获取原始分辨率并设置默认输出文件名 input_path = values['-INPUT-'] if input_path and os.path.exists(input_path): try: video = VideoFileClip(input_path) original_width, original_height = video.size video.close() window['-WIDTH-'].update(original_width) window['-HEIGHT-'].update(original_height) # 设置默认输出文件名 input_filename = os.path.basename(input_path) name, ext = os.path.splitext(input_filename) output_filename = f"{name}_resized{ext}" window['-OUTPUT_NAME-'].update(output_filename) # 启用转换按钮 window['-CONVERT-'].update(disabled=False) except Exception as e: sg.popup_error(f"无法读取视频文件: {str(e)}") elif event == '-KEEP_ASPECT-': # 当切换"保持宽高比"复选框时 if values['-KEEP_ASPECT-'] and original_width and original_height: # 如果勾选了保持宽高比,则根据输入的宽度自动计算高度 try: new_width = int(values['-WIDTH-'] or original_width) new_height = int(new_width * original_height / original_width) window['-HEIGHT-'].update(new_height) except: pass elif event == '-WIDTH-' and values['-KEEP_ASPECT-'] and original_width and original_height: # 当宽度变化且保持宽高比时,自动计算高度 try: new_width = int(values['-WIDTH-'] or original_width) new_height = int(new_width * original_height / original_width) window['-HEIGHT-'].update(new_height) except: pass elif event == '-CONVERT-': # 开始转换过程 input_path = values['-INPUT-'] output_dir = values['-OUTPUT_DIR-'] or os.path.dirname(input_path) output_name = values['-OUTPUT_NAME-'] or f"resized_{os.path.basename(input_path)}" output_path = os.path.join(output_dir, output_name) # 验证输入 if not input_path or not os.path.exists(input_path): sg.popup_error("请输入有效的视频文件!") continue try: width = int(values['-WIDTH-']) height = int(values['-HEIGHT-']) except ValueError: sg.popup_error("请输入有效的分辨率数值!") continue # 显示进度条 window['-PROGRESS-'].update(visible=True) window['-STATUS-'].update("正在处理视频...") window.refresh() # 执行转换 success, message = resize_video(input_path, output_path, width, height) # 隐藏进度条 window['-PROGRESS-'].update(visible=False) if success: window['-STATUS-'].update("转换完成!") sg.popup("成功", message, f"输出文件: {output_path}") else: window['-STATUS-'].update("转换失败!") sg.popup_error("错误", message) window.close() if __name__ == '__main__': main() 优化此代码界面,让软件界面更好看一点,加入多线程处理,线程数量可以自己选择,能自动检测 CPU 核心数并推荐最优线程数量,同时允许用户手动选择。软件处理任务时候总是黑框跳出来,软件处理时显示这个命令框。
08-25
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值