canvas教程

使用Drawable实现小红点(2)

字号+ 作者:H5之家 来源:H5之家 2017-01-06 17:00 我要评论( )

另外,我们还需要一个开关,设置是否显示小红点。 最终,代码实现如下: import android.content.Context; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint;

另外,我们还需要一个开关,设置是否显示小红点。
最终,代码实现如下:

import android.content.Context; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.annotation.IntRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.content.res.ResourcesCompat; import android.view.Gravity; public class RedPointDrawable extends Drawable { private Drawable mDrawable; private boolean mShowRedPoint; private Paint mPaint; private int mRadius; private int mGravity = Gravity.CENTER; public RedPointDrawable(Context context, Drawable origin) { mDrawable = origin;// 原来的drawable mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG); mPaint.setColor(Color.RED); mRadius = context.getResources().getDimensionPixelSize(R.dimen.red_point_radius_small);//小红点半径 } public void setColor(int color) { mPaint.setColor(color); } public void setShowRedPoint(boolean showRedPoint) { mShowRedPoint = showRedPoint; invalidateSelf(); } public void setRadius(int radius) { this.mRadius = radius; } public void setGravity(int gravity) { this.mGravity = gravity; } @Override public void draw(@NonNull Canvas canvas) mDrawable.draw(canvas);//先绘制原图标 if (mShowRedPoint) { // 获取原图标的右上角坐标 int cx = getBounds().right; int cy = getBounds().top; // 计算我们的小红点的坐标 if ((Gravity.LEFT & mGravity) == Gravity.LEFT) { cx -= mRadius; } else if ((Gravity.RIGHT & mGravity) == Gravity.RIGHT) { cx += mRadius; } if ((Gravity.TOP & mGravity) == Gravity.TOP) { cy -= mRadius; } else if ((Gravity.BOTTOM & mGravity) == Gravity.BOTTOM) { cy += mRadius; } canvas.drawCircle(cx, cy, mRadius, mPaint);//绘制小红点 } } @Override public void setAlpha(@IntRange(from = 0, to = 255) int alpha) { mDrawable.setAlpha(alpha); } @Override public void setColorFilter(@Nullable ColorFilter colorFilter) { mDrawable.setColorFilter(colorFilter); } @Override public int getOpacity() { return mDrawable.getOpacity(); } @Override public int getIntrinsicHeight() { return mDrawable.getIntrinsicHeight();//它的高度使用原来的高度 } @Override public int getIntrinsicWidth() { return mDrawable.getIntrinsicWidth();//它的宽度使用原来的宽度 } @Override public void setBounds(@NonNull Rect bounds) { super.setBounds(bounds); mDrawable.setBounds(bounds); } @Override public void setBounds(int left, int top, int right, int bottom) { super.setBounds(left, top, right, bottom); mDrawable.setBounds(left, top, right, bottom); } public static RedPointDrawable wrap(Context context, Drawable drawable) { // 把原来的Drawable包装为一个小红点的Drawable if (drawable instanceof RedPointDrawable) { return (RedPointDrawable) drawable; } return new RedPointDrawable(context, drawable); } }

下面就可以使用它来给我们的导航栏图标设置小红点了。设置导航栏图标的代码改为如下:

final RedPointDrawable icon = new RedPointDrawable(this, ResourcesCompat.getDrawable(getResources(), R.drawable.icon_user, null)); icon.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL); toolbar.setNavigationIcon(icon); // 把drawable添加到我们的成员变量中去,以便后面直接对它进行设置 //mRedPointView.addRedPointDrawable(redPointDrawable);

然后我们可以把这个icon给保存到成员变量里,通过调用这个drawable的setShowRedPoint(boolean)就可以设置显示及隐藏了。
然后我们还要获取侧滑菜单消息中心的drawable,给它也设置一下:

private void initForMessageCenterIcon(NavigationView navigationView) { Menu menu = navigationView.getMenu(); int size = menu.size(); for (int i = 0; i < size; i++) { MenuItem item = menu.getItem(i); if (item.getItemId() == R.id.nav_message) { RedPointDrawable redPointDrawable = RedPointDrawable.wrap(this, item.getIcon()); redPointDrawable.setGravity(Gravity.LEFT); item.setIcon(redPointDrawable); // 把drawable添加到我们的成员变量中去,以便后面直接对它进行设置 //mRedPointView.addRedPointDrawable(redPointDrawable); } } } 总结

在需要小红点时,固然可以通过再写多一个View来实现,这是在可以自定义布局时的一种通用的方式。但如果不想修改布局时,通过Drawable则可以做到对布局文件的零入侵,达到四两拨千斤的效果,不过需要注意Drawable的大小是否仍在控件所允许显示的范围内。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Android开发技巧——使用Drawable实现小红点

相关推荐

评论 抢沙发

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Android开发面试题:Drawable、Bitmap、Canvas和Paint的关系

    Android开发面试题:Drawable、Bitmap、Canvas和Paint的关系

    2017-01-06 16:02

  • 使用CANVAS实现交互性圆形马赛克效果

    使用CANVAS实现交互性圆形马赛克效果

    2017-01-06 16:00

  • HTML5 实现小车动画效果(Canvas/CSS3/JQuery)

    HTML5 实现小车动画效果(Canvas/CSS3/JQuery)

    2017-01-02 14:01

  • 分析实现Android自定义View之递增直方图

    分析实现Android自定义View之递增直方图

    2017-01-01 17:05

网友点评
.