使用WindowManager进行progress提示

本文详细介绍了如何实现并绘制一个自定义的进度条标题栏,包括其核心组件、关键方法以及如何设置其在系统窗口中的显示位置和透明度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package login;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;

import fusion.FusionField;

/**
 * 
 * <一句话功能简述>
 * 
 * @author  0000005487
 * @version  [版本号, 2012-8-3]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class ProgressTitleBar extends View
{
    private Context mContext;
    
    private Paint mPaint;
    
    private WindowManager mWindowManager;
    
    private String mText;
    
    private int mWidth;
    
    private int mHeight;
    
    private int curCount;
    
    private int totalCount;
    
    private int progressValue;
    
    public ProgressTitleBar(Context context)
    {
        super(context);
        this.mContext = context;
        mWindowManager = (WindowManager)mContext.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
        mPaint = new Paint();
    }
    
    public void addToWindow()
    {
        WindowManager.LayoutParams params = new WindowManager.LayoutParams();
                params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
//        params.type = WindowManager.LayoutParams.FIRST_SUB_WINDOW;
        params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        
        params.width = FusionField.screenWidth != 0 ? FusionField.screenWidth : 1280;
        params.height = 20;
        params.alpha = 0.6f;
        
        params.gravity = Gravity.LEFT | Gravity.BOTTOM;
        //以屏幕左上角为原点,设置x、y初始值   
        params.x = 0;
        params.y = mHeight;
        mWindowManager.addView(this, params);
    }
    
    public void removeView()
    {
        mWindowManager.removeView(this);
    }
    
    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
        if (totalCount > 0)
        {
            canvas.drawColor(0x88000000);
            if (progressValue > 0 && progressValue <= 100)
            {
                mPaint.setColor(0x8800FF00);
                canvas.drawRect(0, 0, mWidth * (progressValue / 100f), mHeight, mPaint);
            }
            mPaint.setColor(0xFFFFFFFF);
            
            mPaint.measureText(mText);
            canvas.drawText(mText, (mWidth - mPaint.measureText(mText)) / 2, 18, mPaint);
        }
    }
    
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        mWidth = FusionField.screenWidth != 0 ? FusionField.screenWidth : 1280;
        mHeight = 20;
        setMeasuredDimension(mWidth, mHeight);
    }
    
    public void setProgress(int cCount, int tCount, int pValue)
    {
        this.curCount = cCount < 0 ? 0 : cCount;
        this.totalCount = tCount > curCount ? curCount : tCount;
        
        mText = new StringBuffer("正在上传录像").append(curCount).append("/").append(totalCount).toString();
        
        this.progressValue = pValue < 0 ? 0 : pValue > 100 ? 100 : pValue;
        this.invalidate();
    }
    
}

IntroductionProgressManager 一行代码即可监听 App 中所有网络链接的上传以及下载进度,包括 Glide 的图片加载进度,实现原理类似 EventBus,你可在 App 中的任何地方,将多个监听器,以 Url 地址作为标识符,注册到本框架,当此 Url 地址存在下载或者上传的动作时,框架会主动调用所有使用此 Url 地址注册过的监听器,达到多个模块的同步更新.框架的构思和实现可以看这篇文章Feature使用简单,只需一行代码即可实现进度监听.多平台支持,支持 Okhttp , Retrofit , Glide ,使用 Okhttp 原生 Api ,不存在兼容问题.低耦合,实际请求端和进度接收端并不存在直接或间接的关联关系,即可以在 App 任何地方接收进度信息.侵入性低,使用本框架你并不需要更改之前进行上传或下载的代码,即使用或不使用本框架并不会影响到原有的代码.多端同步,同一个数据源的上传或下载进度可以指定多个不同的接收端,少去了使用 EventBus 实现多个端口同步更新进度.自动管理监听器,少去了手动注销监听器的烦恼.默认运行在主线层,少去了切换线程的烦恼.轻量级框架,不包含任何三方库,体积极小.Download compile 'me.jessyan:progressmanager:1.2.5'UsageStep 1 // 构建 OkHttpClient 时,将 OkHttpClient.Builder() 传入 with() 方法,进行初始化配置  OkHttpClient = ProgressManager.getInstance().with(new OkHttpClient.Builder())                 .build();Step 2 // Glide 下载监听  ProgressManager.getInstance().addResponseListener(IMAGE_URL, getGlideListener()); // Okhttp/Retofit 下载监听  ProgressManager.getInstance().addResponseListener(DOWNLOAD_URL, getDownloadListener()); // Okhttp/Retofit 上传监听  ProgressManager.getInstance().addRequestLisenter(UPLOAD_URL, getUploadListener());ProGuard -keep class me.jessyan.progressmanager.** { *; }  -keep interface me.jessyan.progressmanager.** { *; }About MeEmail: jess.yan.effort@gmail.comHome: http://jessyan.me掘金: https://gold.xitu.io/user/57a9dbd9165abd0061714613简书: http://www.jianshu.com/u/1d0c0bc634db
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值