返回顶部
首页 > 资讯 > 移动开发 >Android 实现桌面未读角标
  • 869
分享到

Android 实现桌面未读角标

Android 2022-06-06 01:06:02 869人浏览 八月长安
摘要

在小米 三星  索尼 手机 :图标上显示数字(未读消息数):这部分代码,是从QQ5.0.apk中找的。 小米已经测试通过了, 三星和索尼的,由于没有相应的手机,没有测

在小米 三星  索尼 手机 :图标上显示数字(未读消息数):这部分代码,是从QQ5.0.apk中找的。

小米已经测试通过了,

三星和索尼的,由于没有相应的手机,没有测试,有的,可能修改一下代码(判断是什么手机的代码),

测试一下,可以在回复一下测试结果,谢谢

1.原生系统(原生的Launcher ),只能修改快捷方式,增加和删除都会有toast提示

2.小米 三星  索尼 手机: 自定义的launcher:  发送显示未读消息数的action已经不同了。具体可以去看代码。。。

判断手机的代码:



    public static void addNumShortCut(Context context,Class<?> clazz,boolean isshowNum, String num, boolean isStroke)
     {
         Log.e(TAG, "manufacturer="+Build.MANUFACTURER);
      if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")){
          //小米
       xiaoMiShortCut(context, clazz, num);
      }else if(Build.MANUFACTURER.equalsIgnoreCase("samsung")){
          //三星
          samsungShortCut(context, num);
      }else {//其他原生系统手机
          installRawShortCut(context, MainActivity.class, isShowNum, num, isStroke);
      }
     }

下面写好的工具类,上面的方法也在其中。



public class AppShortCutUtil {
    private static final String TAG = "AppShortCutUtil";
    //默认圆角半径
    private static final int DEFAULT_CORNER_RADIUS_DIP = 8;
    //默认边框宽度
    private static final int DEFAULT_STROKE_WIDTH_DIP = 2;
    //边框的颜色
    private static final int DEFAULT_STROKE_COLOR = Color.WHITE;
    //中间数字的颜色
    private static final int DEFAULT_NUM_COLOR = Color.parseColor("#CCFF0000");
    
    public static Bitmap generatorNumIcon(Context context, Bitmap icon, boolean isShowNum, String num) {
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        //基准屏幕密度
        float baseDensity = 1.5f;//240dpi
        float factor = dm.density/baseDensity;
        Log.e(TAG, "density:"+dm.density);
        Log.e(TAG, "dpi:"+dm.densityDpi);
        Log.e(TAG, "factor:"+factor);
        // 初始化画布
        int iconSize = (int) context.getResources().getDimension(Android.R.dimen.app_icon_size);
        Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
        canvas canvas = new Canvas(numIcon);
        // 拷贝图片
        Paint iconPaint = new Paint();
        iconPaint.setDither(true);// 防抖动
        iconPaint.setFilterBitmap(true);// 用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
        Rect src = new Rect(0, 0, icon.getWidth(), icon.getHeight());
        Rect dst = new Rect(0, 0, iconSize, iconSize);
        canvas.drawBitmap(icon, src, dst, iconPaint);
        if(isShowNum){
            if(TextUtils.isEmpty(num)){
                num = "0";
            }
            if(!TextUtils.isDigitsOnly(num)){
                //非数字
                Log.e(TAG, "the num is not digit :"+ num);
                num = "0";
            }
            int numInt = Integer.valueOf(num);
            if(numInt > 99){//超过99
                num = "99+";
                // 启用抗锯齿和使用设备的文本字体大小
                Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
                numPaint.setColor(Color.WHITE);
                numPaint.setTextSize(20f*factor);
                numPaint.setTypeface(Typeface.DEFAULT_BOLD);
                int textWidth=(int)numPaint.measureText(num, 0, num.length());
                Log.e(TAG, "text width:"+textWidth);
                int circleCenter = (int) (15*factor);//中心坐标
                int circleRadius = (int) (13*factor);//圆的半径
                //绘制左边的圆形
                Paint leftCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                leftCirPaint.setColor(Color.RED);
                canvas.drawCircle(iconSize-circleRadius-textWidth+(10*factor), circleCenter, circleRadius, leftCirPaint);
                //绘制右边的圆形
                Paint rightCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                rightCirPaint.setColor(Color.RED);
                canvas.drawCircle(iconSize-circleRadius, circleCenter, circleRadius, rightCirPaint);
                //绘制中间的距形
                Paint rectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                rectPaint.setColor(Color.RED);
                RectF oval = new RectF(iconSize-circleRadius-textWidth+(10*factor), 2*factor, iconSize-circleRadius, circleRadius*2+2*factor);
                canvas.drawRect(oval, rectPaint);
                //绘制数字
                canvas.drawText(num, (float)(iconSize-textWidth/2-(24*factor)), 23*factor,    numPaint);
            }else{//<=99
                // 启用抗锯齿和使用设备的文本字体大小
                Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
                numPaint.setColor(Color.WHITE);
                numPaint.setTextSize(20f*factor);
                numPaint.setTypeface(Typeface.DEFAULT_BOLD);
                int textWidth=(int)numPaint.measureText(num, 0, num.length());
                Log.e(TAG, "text width:"+textWidth);
                //绘制外面的圆形
                //Paint outCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                //outCirPaint.setColor(Color.WHITE);
                //canvas.drawCircle(iconSize - 15, 15, 15, outCirPaint);
                //绘制内部的圆形
                Paint inCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                inCirPaint.setColor(Color.RED);
                canvas.drawCircle(iconSize-15*factor, 15*factor, 15*factor, inCirPaint);
                //绘制数字
                canvas.drawText(num, (float)(iconSize-textWidth/2-15*factor), 22*factor, numPaint);
            }
        }
        return numIcon;
    }
    
    public static Bitmap generatorNumIcon2(Context context, Bitmap icon, boolean isShowNum, String num) {
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        //基准屏幕密度
        float baseDensity = 1.5f;//240dpi
        float factor = dm.density/baseDensity;
        Log.e(TAG, "density:"+dm.density);
        Log.e(TAG, "dpi:"+dm.densityDpi);
        Log.e(TAG, "factor:"+factor);
        // 初始化画布
        int iconSize = (int) context.getResources().getDimension(android.R.dimen.app_icon_size);
        Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
        Canvas canvas = new Canvas(numIcon);
        // 拷贝图片
        Paint iconPaint = new Paint();
        iconPaint.setDither(true);// 防抖动
        iconPaint.setFilterBitmap(true);// 用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
        Rect src = new Rect(0, 0, icon.getWidth(), icon.getHeight());
        Rect dst = new Rect(0, 0, iconSize, iconSize);
        canvas.drawBitmap(icon, src, dst, iconPaint);
        if(isShowNum){
            if(TextUtils.isEmpty(num)){
                num = "0";
            }
            if(!TextUtils.isDigitsOnly(num)){
                //非数字
                Log.e(TAG, "the num is not digit :"+ num);
                num = "0";
            }
            int numInt = Integer.valueOf(num);
            if(numInt > 99){//超过99
                num = "99+";
            }
            //启用抗锯齿和使用设备的文本字体大小
            //测量文本占用的宽度
            Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
            numPaint.setColor(Color.WHITE);
            numPaint.setTextSize(20f*factor);
            numPaint.setTypeface(Typeface.DEFAULT_BOLD);
            int textWidth=(int)numPaint.measureText(num, 0, num.length());
            Log.e(TAG, "text width:"+textWidth);
            
            //圆角矩形背景的宽度
            int backgroundHeight = (int) (2*15*factor);
            int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth+10*factor) : backgroundHeight;
            canvas.save();//保存状态
            ShapeDrawable drawable = getDefaultBackground(context);
            drawable.setIntrinsicHeight(backgroundHeight);
            drawable.setIntrinsicWidth(backgroundWidth);
            drawable.setBounds(0, 0, backgroundWidth, backgroundHeight);
            canvas.translate(iconSize-backgroundWidth, 0);
            drawable.draw(canvas);
            canvas.restore();//重置为之前保存的状态
            
            //绘制数字
            canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth)/2), 22*factor, numPaint);
        }
        return numIcon;
    }
    
    public static Bitmap generatorNumIcon3(Context context, Bitmap icon, boolean isShowNum, String num) {
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        //基准屏幕密度
        float baseDensity = 1.5f;//240dpi
        float factor = dm.density/baseDensity;
        Log.e(TAG, "density:"+dm.density);
        Log.e(TAG, "dpi:"+dm.densityDpi);
        Log.e(TAG, "factor:"+factor);
        // 初始化画布
        int iconSize = (int) context.getResources().getDimension(android.R.dimen.app_icon_size);
        Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
        Canvas canvas = new Canvas(numIcon);
        // 拷贝图片
        Paint iconPaint = new Paint();
        iconPaint.setDither(true);// 防抖动
        iconPaint.setFilterBitmap(true);// 用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
        Rect src = new Rect(0, 0, icon.getWidth(), icon.getHeight());
        Rect dst = new Rect(0, 0, iconSize, iconSize);
        canvas.drawBitmap(icon, src, dst, iconPaint);
        if(isShowNum){
            if(TextUtils.isEmpty(num)){
                num = "0";
            }
            if(!TextUtils.isDigitsOnly(num)){
                //非数字
                Log.e(TAG, "the num is not digit :"+ num);
                num = "0";
            }
            int numInt = Integer.valueOf(num);
            if(numInt > 99){//超过99
                num = "99+";
            }
            //启用抗锯齿和使用设备的文本字体大小
            //测量文本占用的宽度
            Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
            numPaint.setColor(Color.WHITE);
            numPaint.setTextSize(20f*factor);
            numPaint.setTypeface(Typeface.DEFAULT_BOLD);
            int textWidth=(int)numPaint.measureText(num, 0, num.length());
            Log.e(TAG, "text width:"+textWidth);
            
            //圆角矩形背景的宽度
            int backgroundHeight = (int) (2*15*factor);
            int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth+10*factor) : backgroundHeight;
            //边框的宽度
            int strokeThickness = (int) (2*factor);
            canvas.save();//保存状态
            int strokeHeight = backgroundHeight + strokeThickness*2;
            int strokeWidth = textWidth>strokeHeight ? (int)(textWidth+ 10*factor + 2*strokeThickness) : strokeHeight;
            ShapeDrawable outStroke = getDefaultStrokeDrawable(context);
            outStroke.setIntrinsicHeight(strokeHeight);
            outStroke.setIntrinsicWidth(strokeWidth);
            outStroke.setBounds(0, 0, strokeWidth, strokeHeight);
            canvas.translate(iconSize-strokeWidth-strokeThickness, strokeThickness);
            outStroke.draw(canvas);
            canvas.restore();//重置为之前保存的状态
            canvas.save();//保存状态
            ShapeDrawable drawable = getDefaultBackground(context);
            drawable.setIntrinsicHeight((int) (backgroundHeight+2*factor));
            drawable.setIntrinsicWidth((int) (backgroundWidth+2*factor));
            drawable.setBounds(0, 0, backgroundWidth, backgroundHeight);
            canvas.translate(iconSize-backgroundWidth-2*strokeThickness, 2*strokeThickness);
            drawable.draw(canvas);
            canvas.restore();//重置为之前保存的状态
            
            //绘制数字
            canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth+4*strokeThickness)/2), (22)*factor+2*strokeThickness, numPaint);
        }
        return numIcon;
    }
    
    public static Bitmap generatorNumIcon4(Context context, Bitmap icon, boolean isShowNum, String num) {
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        //基准屏幕密度
        float baseDensity = 1.5f;//240dpi
        float factor = dm.density/baseDensity;
        Log.e(TAG, "density:"+dm.density);
        Log.e(TAG, "dpi:"+dm.densityDpi);
        Log.e(TAG, "factor:"+factor);
        // 初始化画布
        int iconSize = (int) context.getResources().getDimension(android.R.dimen.app_icon_size);
        Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
        Canvas canvas = new Canvas(numIcon);
        // 拷贝图片
        Paint iconPaint = new Paint();
        iconPaint.setDither(true);// 防抖处理
        iconPaint.setFilterBitmap(true);// 用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
        Rect src = new Rect(0, 0, icon.getWidth(), icon.getHeight());
        Rect dst = new Rect(0, 0, iconSize, iconSize);
        canvas.drawBitmap(icon, src, dst, iconPaint);
        if(isShowNum){
            if(TextUtils.isEmpty(num)){
                num = "0";
            }
            if(!TextUtils.isDigitsOnly(num)){
                //非数字
                Log.e(TAG, "the num is not digit :"+ num);
                num = "0";
            }
            int numInt = Integer.valueOf(num);
            if(numInt > 99){//超过99
                num = "99+";
            }
            //启用抗锯齿和使用设备的文本字体
            //测量文本占用的宽度
            Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
            numPaint.setColor(Color.WHITE);
            numPaint.setTextSize(25f*factor);
            numPaint.setTypeface(Typeface.DEFAULT_BOLD);
            int textWidth=(int)numPaint.measureText(num, 0, num.length());
            Log.e(TAG, "text width:"+textWidth);
            
            //边框的宽度
            int strokeThickness = (int) (DEFAULT_STROKE_WIDTH_DIP*factor);
            //圆角矩形背景的宽度
            float radiusPx = 15*factor;
            int backgroundHeight = (int) (2*(radiusPx+strokeThickness));//2*(半径+边框宽度)
            int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth + 10*factor + 2*strokeThickness) : backgroundHeight;
            canvas.save();//保存状态
            ShapeDrawable drawable = getDefaultBackground2(context);
            drawable.setIntrinsicHeight(backgroundHeight);
            drawable.setIntrinsicWidth(backgroundWidth);
            drawable.setBounds(0, 0, backgroundWidth, backgroundHeight);
            canvas.translate(iconSize-backgroundWidth-strokeThickness, 2*strokeThickness);
            drawable.draw(canvas);
            canvas.restore();//重置为之前保存的状态
            
            //绘制数字
            canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth+2*strokeThickness)/2), (float) (25*factor+2.5*strokeThickness), numPaint);
        }
        return numIcon;
    }
    
    public static void installRawShortCut(Context context, Class<?> clazz, boolean isShowNum, String num, boolean isStroke) {
        Log.e(TAG, "installShortCut....");
        Intent shortcutIntent = new Intent(    "com.android.launcher.action.INSTALL_SHORTCUT");
        //名称
        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,    context.getString(R.string.app_name));
        // 是否可以有多个快捷方式的副本,参数如果是true就可以生成多个快捷方式,如果是false就不会重复添加
        shortcutIntent.putExtra("duplicate", false);
        //点击快捷方式:打开activity
        Intent mainIntent = new Intent(Intent.ACTION_MAIN);
        mainIntent.addCateGory(Intent.CATEGORY_LAUNCHER);
        mainIntent.setClass(context, clazz);
        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, mainIntent);
        //快捷方式的图标
        if(isStroke){
            shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON,
                    generatorNumIcon4(
                            context, 
                            ((BitmapDrawable)context.getResources().getDrawable(R.drawable.ic_launcher)).getBitmap(),
                            isShowNum, 
                            num));
        }else{
            shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON,
                    generatorNumIcon2(
                            context, 
                            ((BitmapDrawable)context.getResources().getDrawable(R.drawable.ic_launcher)).getBitmap(),
                            isShowNum, 
                            num));
        }
        context.sendBroadcast(shortcutIntent);
    }
    
    public static boolean isAddShortCut(Context context) {
         Log.e(TAG, "isAddShortCut....");
      boolean isInstallShortcut = false;
      final ContentResolver cr = context.getContentResolver();
      //TODO 注释的代码,在有的手机:修改了ROM的系统,不能支持
      
        String AUTHORITY = getAuthorityFromPermission(context, "com.android.launcher.permission.READ_SETTINGS");
        Log.e(TAG, "AUTHORITY : " +AUTHORITY);
        final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
        + "/favorites?notify=true");
        Cursor c = cr.query(CONTENT_URI,
            new String[] { "title" }, "title=?",
            new String[] { context.getString(R.string.app_name) }, null);
        if (c != null && c.getCount() > 0) {
          isInstallShortcut = true;
        }
        if(c != null){
            c.close();
        }
        Log.e(TAG, "isAddShortCut....isInstallShortcut="+isInstallShortcut);
      return isInstallShortcut;
    }
    
     public static void deleteShortCut(Context context, Class<?> clazz){
         Log.e(TAG, "delShortcut....");
         if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")){
            //小米
            //当为""时,不显示数字,相当于隐藏了)
            xiaoMiShortCut(context, clazz, "");
        }else if(Build.MANUFACTURER.equalsIgnoreCase("samsung")){
            //三星
            samsungShortCut(context, "0");
        }else {//其他原生系统手机
            //删除显示数字的快捷方式
            deleteRawShortCut(context, clazz);
            //安装不显示数字的快捷方式
            //installRawShortCut(context, clazz, false, "0");
        }
     }
    
    public static void deleteRawShortCut(Context context, Class<?> clazz) {
        Intent intent = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");
        //快捷方式的名称
        intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, context.getString(R.string.app_name));
        Intent intent2 = new Intent(); 
        intent2.setClass(context, clazz); 
        intent2.setAction(Intent.ACTION_MAIN); 
        intent2.addCategory(Intent.CATEGORY_LAUNCHER); 
        intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,intent2); 
        context.sendBroadcast(intent);
    }
     
    public static String getAuthorityFromPermission(Context context, String permission) {
        if (TextUtils.isEmpty(permission)) {
            return null;
        }
        List<PackageInfo> packInfos = context.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS);
        if (packInfos == null) {
            return null;
        }
        for (PackageInfo info : packInfos) {
            ProviderInfo[] providers = info.providers;
            if (providers != null) {
                for (ProviderInfo provider : providers) {
                    if (permission.equals(provider.readPermission)
                            || permission.equals(provider.writePermission)) {
                        return provider.authority;
                    }
                }
            }
        }
        return null;
    }
    
    public static void xiaoMiShortCut(Context context,Class<?> clazz, String num)
     {
        Log.e(TAG, "xiaoMiShortCut....");
        Intent localIntent = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE");
        localIntent.putExtra("android.intent.extra.update_application_component_name", context.getPackageName()+"/."+clazz.getSimpleName());
        if(TextUtils.isEmpty(num)){
            num = "";
        }else{
          int numInt = Integer.valueOf(num);
          if (numInt > 0){
             if (numInt > 99){
                num = "99";
           }
          }else{
              num = "0";
          }
        }
        localIntent.putExtra("android.intent.extra.update_application_message_text", num);
        context.sendBroadcast(localIntent);
     }                                            
     
    public static void sonyShortCut(Context context, String num)
     {
      String activityName = getLaunchActivityName(context);
      if (activityName == null){
       return;
      }
      Intent localIntent = new Intent();
      int numInt = Integer.valueOf(num);
      boolean isShow = true;
      if (numInt < 1){
       num = "";
       isShow = false;
      }else if (numInt > 99){
          num = "99";
      }
      localIntent.putExtra("com.sonyeriCSSon.home.intent.extra.badge.SHOW_MESSAGE", isShow);
      localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
      localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", activityName);
      localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", num);
      localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());
      context.sendBroadcast(localIntent);
     }
     
    public static void samsungShortCut(Context context, String num)
     {
        int numInt = Integer.valueOf(num);
      if (numInt < 1)
      {
       num = "0";
      }else if (numInt > 99){
          num = "99";
      }
         String activityName = getLaunchActivityName(context);
      Intent localIntent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
      localIntent.putExtra("badge_count", num);
      localIntent.putExtra("badge_count_package_name", context.getPackageName());
      localIntent.putExtra("badge_count_class_name", activityName);
      context.sendBroadcast(localIntent);
     }
     
    public static void addNumShortCut(Context context,Class<?> clazz,boolean isShowNum, String num, boolean isStroke)
     {
         Log.e(TAG, "manufacturer="+Build.MANUFACTURER);
      if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")){
          //小米
       xiaoMiShortCut(context, clazz, num);
      }else if(Build.MANUFACTURER.equalsIgnoreCase("samsung")){
          //三星
          samsungShortCut(context, num);
      }else {//其他原生系统手机
          installRawShortCut(context, MainActivity.class, isShowNum, num, isStroke);
      }
     }
     
    public static String getLaunchActivityName(Context context)
     {
      PackageManager localPackageManager = context.getPackageManager();
      Intent localIntent = new Intent("android.intent.action.MAIN");
      localIntent.addCategory("android.intent.category.LAUNCHER");
      try
      {
       Iterator<ResolveInfo> localIterator = localPackageManager.queryIntentActivities(localIntent, 0).iterator();
       while (localIterator.hasNext())
       {
        ResolveInfo localResolveInfo = localIterator.next();
        if (!localResolveInfo.activityInfo.applicationInfo.packageName.equalsIgnoreCase(context.getPackageName()))
         continue;
        String str = localResolveInfo.activityInfo.name;
        return str;
       }
      }
      catch (Exception localException)
      {
       return null;
      }
      return null;
     }
    
    private static ShapeDrawable getDefaultBackground(Context context) {
        //这个是为了应对不同分辨率的手机,屏幕兼容性
        int r = dipToPixels(context,DEFAULT_CORNER_RADIUS_DIP);
        float[] outerR = new float[] {r, r, r, r, r, r, r, r};
        //圆角矩形
        RoundRectShape rr = new RoundRectShape(outerR, null, null);
        ShapeDrawable drawable = new ShapeDrawable(rr);
        drawable.getPaint().setColor(DEFAULT_NUM_COLOR);//设置颜色
        return drawable;
    }
    
    private static ShapeDrawable getDefaultBackground2(Context context) {
        //这个是为了应对不同分辨率的手机,屏幕兼容性
        int r = dipToPixels(context,DEFAULT_CORNER_RADIUS_DIP);
        float[] outerR = new float[] {r, r, r, r, r, r, r, r};
        int distance = dipToPixels(context,DEFAULT_STROKE_WIDTH_DIP);
        //圆角矩形
        RoundRectShape rr = new RoundRectShape(outerR, null, null);
        customBorderDrawable drawable = new customBorderDrawable(context,rr);
        drawable.getFillpaint().setColor(DEFAULT_NUM_COLOR);//设置填充颜色
        drawable.getStrokepaint().setColor(DEFAULT_STROKE_COLOR);//设置边框颜色
        drawable.getStrokepaint().setStrokeWidth(distance);//设置边框宽度
        return drawable;
    }
    
    private static ShapeDrawable getDefaultStrokeDrawable(Context context) {
        //这个是为了应对不同分辨率的手机,屏幕兼容性
        int r = dipToPixels(context, DEFAULT_CORNER_RADIUS_DIP);
        int distance = dipToPixels(context, DEFAULT_STROKE_WIDTH_DIP);
        float[] outerR = new float[] {r, r, r, r, r, r, r, r};
        //圆角矩形
        RoundRectShape rr = new RoundRectShape(outerR, null, null);
        ShapeDrawable drawable = new ShapeDrawable(rr);
        drawable.getPaint().setStrokeWidth(distance);
        drawable.getPaint().setStyle(Paint.Style.FILL);
        drawable.getPaint().setColor(DEFAULT_STROKE_COLOR);//设置颜色
        return drawable;
    }
    
    public static int dipToPixels(Context context, int dip) {
        Resources r = context.getResources();
        float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, r.getDisplayMetrics());
        return (int) px;
    }
}
您可能感兴趣的文章:Android实现购物车及其他功能的角标Android为应用添加数字角标的简单实现


--结束END--

本文标题: Android 实现桌面未读角标

本文链接: https://lsjlt.com/news/21806.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android 实现桌面未读角标
    在小米 三星  索尼 手机 :图标上显示数字(未读消息数):这部分代码,是从QQ5.0.apk中找的。 小米已经测试通过了, 三星和索尼的,由于没有相应的手机,没有测...
    99+
    2022-06-06
    Android
  • Android 桌面图标右上角显示未读消息数字
    背景: 在Android原生系统中,众所周知不支持桌面图标显示未读消息提醒的数字,虽然第三方控件BadgeView可以实现应用内的数字提醒。但对于系统的图标,特别是app的lo...
    99+
    2022-06-06
    Android
  • 如何在Android应用中添加一个桌面未读角标功能
    这期内容当中小编将会给大家带来有关如何在Android应用中添加一个桌面未读角标功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.原生系统(原生的Launcher ),只能修改快捷方式,增加和删除都会...
    99+
    2023-05-31
    android roi
  • C#实现系统桌面右下角弹框
    目录实践过程效果代码实践过程 效果 代码 public partial class GroundForm : Form { public GroundFo...
    99+
    2023-01-05
    C#实现系统桌面弹框 C#实现桌面弹框 C#桌面弹框 C# 弹窗
  • GridView实现桌面图标显示案例
    GridView实现桌面图标显示案例,供大家参考,具体内容如下 用法与ListView类似,需要以下几步: 1、定义实体类2、自定义适配器继承BaseAdapter3、定义GridV...
    99+
    2024-04-02
  • Android实现定制桌面的方法
    本文实例讲述了Android实现定制桌面的方法。分享给大家供大家参考。具体如下: launcher也就是我们的Home,可以简单地把它理解为一个简化的linux GUI。作为一...
    99+
    2022-06-06
    方法 Android
  • Android实现未读消息小红点显示实例
    目录代码实现小红点实现总结使用 fragmentLayout 实现,可以把小红点添加到任意 view 上。 效果 添加小红点到 textview 上 添加小红点到 imagevie...
    99+
    2024-04-02
  • 怎么从Windows桌面删除未使用的图标
    本篇文章为大家展示了怎么从Windows桌面删除未使用的图标,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Windows桌面上可能有许多来自不同来源的图标。有些安装在Windows上,有些在安装软件...
    99+
    2023-06-05
  • Win7桌面图标右下角小盾牌怎么去掉?
    最近不少用户都反应说win7纯净版桌面快捷图片右下角出现了自己不喜欢的小盾牌,虽然这个标识给软件程序不会带来大的影响,可是对于整体的美观影响确实很大的,因此不少用户对此都比较反感的。桌面快捷图标上小盾牌其实就属于 &ld...
    99+
    2023-06-13
    Win7 图标 小盾牌去掉方法 桌面图标 盾牌
  • Android如何实现桌面快捷方式
    这篇文章主要介绍了Android如何实现桌面快捷方式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Android 快捷方式使用方式ShortcutUtils.getInsta...
    99+
    2023-06-22
  • Android WindowManger实现桌面悬浮窗功能
    目录效果图使用WindowManager实现分析问题参考如果想实现一个在桌面显示的悬浮窗,用Dialog、PopupWindow、Toast等已经不能实现了,他们基本都是在Activ...
    99+
    2023-05-18
    Android桌面悬浮窗 Android WindowManger悬浮窗
  • Android仿QQ滑动弹出菜单标记已读、未读消息
    在上一篇《Android仿微信滑动弹出编辑、删除菜单效果、增加下拉刷新功能》里,已经带着大家学习如何使用SwipeMenuListView这一开源库实现滑动列表弹出菜单,接下来...
    99+
    2022-06-06
    菜单 标记 弹出菜单 Android
  • Android怎么实现未读消息小红点显示
    今天小编给大家分享一下Android怎么实现未读消息小红点显示的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用 fragm...
    99+
    2023-06-29
  • Android实现购物车及其他功能的角标
    1.先来张效果图 2.自定义一个角标工具类BottomBarView 。 ** * Created by Administrator on 2016/12/27. * ...
    99+
    2022-06-06
    购物车 Android
  • Android实现桌面快捷方式实例代码
    Android 快捷方式 使用方式 ShortcutUtils.getInstance().addShortcut(this , ...
    99+
    2024-04-02
  • Android实现获取未接来电和未读短信数量的方法
    本文实例展示了Android实现获取未接来电和未读短信数量的方法,在Android程序开发中非常常见,是非常实用的功能,现分享给大家供大家参考。具体如下: 一、未读短信 &nb...
    99+
    2022-06-06
    方法 Android
  • Android自定义桌面功能代码实现
    先上运行效果图首先我们要把一张自己喜欢的图片放到sdcard中,总之,只要我们可以获取这个图片就可以了。 我这里是放在sdcard中的,可以在eclipse中用鼠标点击导入,比...
    99+
    2022-06-06
    Android
  • java怎么实现已读未读功能
    在Java中,可以通过以下几种方式实现已读未读功能:1. 使用数据库:创建一个数据表来存储每个用户的消息和阅读状态。表中的字段可以包...
    99+
    2023-08-08
    java
  • Android如何动态改变App桌面图标
    时不时的我们就会发现,一些我们常见的应用,比如某宝,某东,在一些特殊的日子中,比如双十一,元旦,为了迎合这样一个日子的气氛,在桌面的应用图标就会发生改变,其实对于这样的一个桌面...
    99+
    2022-06-06
    app 动态 Android
  • 如何去掉桌面右下角任务栏NVIDIA设置图标
    这篇文章主要讲解了“如何去掉桌面右下角任务栏NVIDIA设置图标”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何去掉桌面右下角任务栏NVIDIA设置图标”吧!单击Nvidia设置小图标,会...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作