实现的最终效果:
目录
修改图标位置+添加应用名称
修改类: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