前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android遇到的一些小问题

Android遇到的一些小问题

作者头像
None_Ling
发布2018-12-19 15:56:20
1K0
发布2018-12-19 15:56:20
举报
文章被收录于专栏:Android相关Android相关

背景

很久没写过UI了,最近项目比较忙,遇到几个问题记录一下。

  1. 设置文本行间距
  2. PopupWindow无法显示
  3. 绘制有色阴影

调整文字间距

问题

UE希望调整文本行间距,原来只记得有lineSpacing的属性,而且只能调整行间距的倍数。

方案

后来查资料,发现可以通过lineSpacingExtra来为行间距添加具体的Dimen值,并且可以为负数,如果为负数的话,会让行间距更加紧凑。 而lineSpacingMultiplier属性则是为行间距设置倍数的。

PopupWindow无法显示

问题

在使用Popupwindow的showAsDropDown时候,发现PopupWindow无法弹出,而且UI出现卡死的情况

方案

原因是PopupWindow没有设置宽高,导致这种情况。所以在使用前必须setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);设置宽高,否则无法显示。

有色阴影

问题

在最近的改版中,发现有很多按钮的渐变,并且按钮出现了有色的阴影,而如果使用Android自带的translationZ以及elevation来调整Z轴的高度和倾斜度可以实现简单的黑色阴影。可是不能设置彩色

方案

可以通过Paint的setShadowLayer设置阴影层,并且在onDraw绘制背景前绘制即可。 需要注意的点:

  1. ViewGroup必须将setWillNotDraw(false),否则父View不会重绘
  2. setShadowLayer只能应用于CPU绘制,必须关闭硬件加速,否则无法绘制
  3. 阴影的颜色必须带透明度,如果没有透明度的话,则不会绘制阴影

下面是简单的Demo:

代码语言:javascript
复制
public class ShadowLayout extends FrameLayout {
    private Paint paint;
    private RectF rectF;
    private int mShadowPadding;
    private int mShadowRadius;
    private int mShadowDx;
    private int mShadowDy;
    private int mShadowColor;
    private int mRoundRadius;

    public ShadowLayout(@NonNull Context context) {
        super(context);
        initPaint();
    }

    public ShadowLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initPaint();
    }

    public ShadowLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }

    private void initPaint() {
        // ViewGroup必须设置,否则不会重绘
        setWillNotDraw(false);
        // 必须使用CPU绘制,关闭硬件加速,否则不会绘制
        setLayerType(LAYER_TYPE_SOFTWARE, null);
        mShadowPadding = getContext().getResources().getDimensionPixelSize(R.dimen.20dp);
        setPadding(mShadowPadding, mShadowPadding, mShadowPadding, mShadowPadding);
        //  圆角的弧度 
        mRoundRadius = getContext().getResources().getDimensionPixelSize(R.dimen.25dp);
        mShadowRadius = getContext().getResources().getDimensionPixelSize(R.dimen.10dp);
        // 阴影的倾斜度
        mShadowDx = getContext().getResources().getDimensionPixelSize(R.dimen.2dp);
        mShadowDy = getContext().getResources().getDimensionPixelSize(R.dimen.5dp);
        // 阴影的颜色必须带透明度,否则不会绘制
        mShadowColor = Color.parse("#9FFF0000");
        paint = new Paint();
        paint.setColor(Color.TRANSPARENT);
        paint.setShadowLayer(mShadowRadius, mShadowDx, mShadowDy, mShadowColor);
        rectF = new RectF();
    }

    public void setShadowColor(int color) {
        mShadowColor = color;
        setShadowLayer();
    }

    private void setShadowLayer() {
        paint.setShadowLayer(mShadowRadius, mShadowDx, mShadowDy, mShadowColor);
        postInvalidate();
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        rectF.left = getPaddingLeft();
        rectF.right = getWidth() - getPaddingRight();
        rectF.bottom = getHeight() - getPaddingBottom();
        rectF.top = getPaddingTop();
        // 绘制带阴影的圆角矩形
        canvas.drawRoundRect(rectF, mRoundRadius, mRoundRadius, paint);
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 调整文字间距
    • 问题
      • 方案
      • PopupWindow无法显示
        • 问题
          • 方案
          • 有色阴影
            • 问题
              • 方案
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档