Android12 Launcher3 最近任务客制化

本文详细介绍了如何定制Android12的Launcher3,包括修改最近任务的图标位置,添加应用名称,调整边距,将多任务背景改为壁纸,修改Task预览图的圆角半径,以及移动和添加清除全部按钮。同时,文章还讨论了最近任务为空时的显示,缩放效果的实现以及在实现过程中遇到的bug及其解决方案。
摘要由CSDN通过智能技术生成

实现的最终效果:

 

目录

修改图标位置+添加应用名称

代码实现:

图标控件的边距调整:

多任务背景改成壁纸

修改Task预览图的圆角半径:

清除全部按钮移动到底部显示

首先隐藏原有的清除按钮:

添加新的底部清除全部按钮:

最近任务为空时的图片、字体颜色等

缩放效果


修改图标位置+添加应用名称

修改类:com.android.quickstep.views.IconView.java

把应用名称放到图标右边,方案:自定义view在onDraw里面canvas.drawText

代码实现:

增加字段:

//增加应用名称
private String mText;
private Paint mTxtPain;
private int mTextMargins;

在构造函数里面增加初始化的方法initView(),初始化画笔的属性:

private void initView() {
    mTxtPain = new Paint();
    mTxtPain.setColor(ContextCompat.getColor(getContext(), R.color.recent_task_text));//字体颜色
    mTxtPain.setFlags(Paint.ANTI_ALIAS_FLAG);
    mTxtPain.setTextSize(getResources().getDimension(R.dimen.notification_main_title_size));//自己定义字体字号
    mTxtPain.setTextAlign(Paint.Align.LEFT);//左对齐

    mTextMargins = (int) getResources().getDimension(R.dimen.task_thumbnail_icon_margin);//10dp
}

增加提供给外部调用设置文本方法:

//这里设置完文本后面图片资源会去绘制,所以这里不需要invalidate来重复绘制一遍
public void setText(String text){
    setText(text,false);
}
//如果在绘制完图标图片资源之后还想要修改文本,则需要重新绘制,需要invalidate传true
public void setText(String text,boolean invalidate){
    this.mText = text;
    if(invalidate){
        invalidate();
    }
}

修改图标的位置:

private void setDrawableSizeInternal(int selfWidth, int selfHeight) {
    Rect selfRect = new Rect(0, 0, selfWidth, selfHeight);
    Rect drawableRect = new Rect();
    //Gravity.apply(Gravity.CENTER, mDrawableWidth, mDrawableHeight, selfRect, drawableRect); //原先是居中对齐
    Gravity.apply(Gravity.START, mDrawableWidth, mDrawableHeight, selfRect, drawableRect); //修改为左对齐
    mDrawable.setBounds(drawableRect);
}

绘制App名称文本:

@Override
protected void onDraw(Canvas canvas) {
    if (mDrawable != null) {
        mDrawable.draw(canvas);
    }

    if(mText != null) {
        Paint.FontMetrics fontMetrics = mTxtPain.getFontMetrics();
        float top = fontMetrics.top;//为基线到字体上边框的距离
        float bottom = fontMetrics.bottom;//为基线到字体下边框的距离
        int textLeft = mDrawableWidth + mTextMargins;
        int baseLineY = (int) (getHeight()/2 + (bottom - top)/2 - bottom);
        canvas.drawText(mText, textLeft, baseLineY, mTxtPain);
    }
}

图标控件的边距调整:

竖屏情况下修改类PortraitPagedViewHandler.setIconAndSnapshotParams。自行调节边距,达到自己要的预期。

我这边的结果如下:

@Override
public void setIconAndSnapshotParams(View iconView, int taskIconMargin, int taskIconHeight,
        FrameLayout.LayoutParams snapshotParams, boolean isRtl) {
    FrameLayout.LayoutParams iconParams =
            (FrameLayout.LayoutParams) iconView.getLayoutParams();
    iconParams.gravity = (isRtl ? END : START);
    iconParams.leftMargin = iconParams.rightMargin = 0;
    int iconMargin = (int) iconView.getContext().getResources()
            .getDimension(R.dimen.task_thumbnail_icon_margin);//10dp
    iconParams.topMargin = snapshotParams.topMargin / 2 + iconMargin * 2;
}

横屏情况有两个类:

旋转90度的横屏(音量键和电源键边在上边):LandscapePagedViewHandler

旋转270度的横屏(音量键和电源键边在下边):SeascapePagedViewHandler

横屏时的边距一开始一直调试都不对,后面才发现原来机器根本没有旋转,就算是横屏,边距的上下左右都是针对竖屏时的方向计算的。比如,LandscapePagedViewHandler时,图标应该是靠近音量键方向的,横着看是在左上角,实际上代码上面实现的时候,图标位置是相对于竖屏来调节的,也就是在竖屏的右上角。SeascapePagedViewHandler类似,图标位置是在左下角。

LandscapePagedViewHandler:

@Override
public void setIconAndSnapshotParams(View iconView, int taskIconMargin, in
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值