Android 为应用添加数字角标
今天在论坛上看到了一个帖子,终于搞清了我很久以来的一个困惑,android到底能不能实现ios的角标效果,QQ是怎么实现的。看了这个帖子顿时终于解除了我的困惑。
先说一个下大概的思路:
大家都知道android系统默认是不支持角标的。但是有时候你又可以在很多系统上看到角标,这些系统包括 小米手机的miui 三星手机的TouchWiz 索尼手机; 这些手机的系统应用都可以显示数字角标。这是应为这些系统进行了定制,使用的是自己的launcher. 所以在这些系统上的实现思路就是使用这些手机的私有api来实现显示角标。但是还有一部分手机不支持 实现方法是通过快捷方式,创建一个带角标的应用的快捷方式。需要更新角标的时候就去通过更新快捷方式来实现。
整个帖子的实现思路就是这样的。最后附上链接:http://www.eoeandroid.com/thread-542394-1-1.html
小米已经测试通过了,
三星和索尼的,由于没有相应的手机,没有测试,有的,可能修改一下代码(判断是什么手机的代码),
测试一下,可以在回复一下测试结果,谢谢
2.小米 三星 索尼 手机: 自定义的launcher: 发送显示未读消息数的action已经不同了。具体可以去看代码。。。
/***
* 在应用图标的快捷方式上加数字
* @param clazz 启动的activity
* @param isShowNum 是否显示数字
* @param num 显示的数字:整型
* @param isStroke 是否加上边框
*
*/
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);
} }
下面写好的工具类,上面的方法也在其中。
/***
* 应用的快捷方式工具类
*
* @author yang
*
*/
public class AppShortCutUtil { private static final String TAG = "AppShortCutUtil"; //默认圆角半径
private static final int DEFAULT_CORNER_RADIUS_DIP = ;
//默认边框宽度
private static final int DEFAULT_STROKE_WIDTH_DIP = ;
//边框的颜色
private static final int DEFAULT_STROKE_COLOR = Color.WHITE;
//中间数字的颜色
private static final int DEFAULT_NUM_COLOR = Color.parseColor("#CCFF0000"); /***
*
* 生成有数字的图片(没有边框)
* @param context
* @param icon 图片
* @param isShowNum 是否要绘制数字
* @param num 数字字符串:整型数字 超过99,显示为"99+"
* @return
*/
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(, , icon.getWidth(), icon.getHeight());
Rect dst = new Rect(, , iconSize, iconSize);
canvas.drawBitmap(icon, src, dst, iconPaint); if(isShowNum){ if(TextUtils.isEmpty(num)){
num = "";
} if(!TextUtils.isDigitsOnly(num)){
//非数字
Log.e(TAG, "the num is not digit :"+ num);
num = "";
} int numInt = Integer.valueOf(num); if(numInt > ){//超过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, , num.length()); Log.e(TAG, "text width:"+textWidth); int circleCenter = (int) (*factor);//中心坐标
int circleRadius = (int) (*factor);//圆的半径 //绘制左边的圆形
Paint leftCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
leftCirPaint.setColor(Color.RED);
canvas.drawCircle(iconSize-circleRadius-textWidth+(*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+(*factor), *factor, iconSize-circleRadius, circleRadius*+*factor);
canvas.drawRect(oval, rectPaint); //绘制数字
canvas.drawText(num, (float)(iconSize-textWidth/-(*factor)), *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, , 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-*factor, *factor, *factor, inCirPaint); //绘制数字
canvas.drawText(num, (float)(iconSize-textWidth/-*factor), *factor, numPaint);
}
}
return numIcon;
} /***
*
* 生成有数字的图片(没有边框)
* @param context
* @param icon 图片
* @param isShowNum 是否要绘制数字
* @param num 数字字符串:整型数字 超过99,显示为"99+"
* @return
*/
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(, , icon.getWidth(), icon.getHeight());
Rect dst = new Rect(, , iconSize, iconSize);
canvas.drawBitmap(icon, src, dst, iconPaint); if(isShowNum){ if(TextUtils.isEmpty(num)){
num = "";
} if(!TextUtils.isDigitsOnly(num)){
//非数字
Log.e(TAG, "the num is not digit :"+ num);
num = "";
} int numInt = Integer.valueOf(num); if(numInt > ){//超过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, , num.length());
Log.e(TAG, "text width:"+textWidth); /**----------------------------------*
* TODO 绘制圆角矩形背景 start
*------------------------------------*/
//圆角矩形背景的宽度
int backgroundHeight = (int) (**factor);
int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth+*factor) : backgroundHeight; canvas.save();//保存状态 ShapeDrawable drawable = getDefaultBackground(context);
drawable.setIntrinsicHeight(backgroundHeight);
drawable.setIntrinsicWidth(backgroundWidth);
drawable.setBounds(, , backgroundWidth, backgroundHeight);
canvas.translate(iconSize-backgroundWidth, );
drawable.draw(canvas); canvas.restore();//重置为之前保存的状态 /**----------------------------------*
* TODO 绘制圆角矩形背景 end
*------------------------------------*/ //绘制数字
canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth)/), *factor, numPaint);
}
return numIcon;
}
/***
*
* 生成有数字的图片(有边框)
* @param context
* @param icon 图片
* @param isShowNum 是否要绘制数字
* @param num 数字字符串:整型数字 超过99,显示为"99+"
* @return
*/
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(, , icon.getWidth(), icon.getHeight());
Rect dst = new Rect(, , iconSize, iconSize);
canvas.drawBitmap(icon, src, dst, iconPaint); if(isShowNum){ if(TextUtils.isEmpty(num)){
num = "";
} if(!TextUtils.isDigitsOnly(num)){
//非数字
Log.e(TAG, "the num is not digit :"+ num);
num = "";
} int numInt = Integer.valueOf(num); if(numInt > ){//超过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, , num.length());
Log.e(TAG, "text width:"+textWidth); /**----------------------------------*
* TODO 绘制圆角矩形背景:先画边框,再画内部的圆角矩形 start
*------------------------------------*/
//圆角矩形背景的宽度
int backgroundHeight = (int) (**factor);
int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth+*factor) : backgroundHeight;
//边框的宽度
int strokeThickness = (int) (*factor); canvas.save();//保存状态 int strokeHeight = backgroundHeight + strokeThickness*;
int strokeWidth = textWidth>strokeHeight ? (int)(textWidth+ *factor + *strokeThickness) : strokeHeight;
ShapeDrawable outStroke = getDefaultStrokeDrawable(context);
outStroke.setIntrinsicHeight(strokeHeight);
outStroke.setIntrinsicWidth(strokeWidth);
outStroke.setBounds(, , strokeWidth, strokeHeight);
canvas.translate(iconSize-strokeWidth-strokeThickness, strokeThickness);
outStroke.draw(canvas); canvas.restore();//重置为之前保存的状态 canvas.save();//保存状态 ShapeDrawable drawable = getDefaultBackground(context);
drawable.setIntrinsicHeight((int) (backgroundHeight+*factor));
drawable.setIntrinsicWidth((int) (backgroundWidth+*factor));
drawable.setBounds(, , backgroundWidth, backgroundHeight);
canvas.translate(iconSize-backgroundWidth-*strokeThickness, *strokeThickness);
drawable.draw(canvas); canvas.restore();//重置为之前保存的状态 /**----------------------------------*
* TODO 绘制圆角矩形背景 end
*------------------------------------*/ //绘制数字
canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth+*strokeThickness)/), ()*factor+*strokeThickness, numPaint);
}
return numIcon;
} /***
*
* 生成有数字的图片(有边框的)
* @param context
* @param icon 图片
* @param isShowNum 是否要绘制数字
* @param num 数字字符串:整型数字 超过99,显示为"99+"
* @return
*/
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(, , icon.getWidth(), icon.getHeight());
Rect dst = new Rect(, , iconSize, iconSize);
canvas.drawBitmap(icon, src, dst, iconPaint); if(isShowNum){ if(TextUtils.isEmpty(num)){
num = "";
} if(!TextUtils.isDigitsOnly(num)){
//非数字
Log.e(TAG, "the num is not digit :"+ num);
num = "";
} int numInt = Integer.valueOf(num); if(numInt > ){//超过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, , num.length());
Log.e(TAG, "text width:"+textWidth); /**----------------------------------*
* TODO 绘制圆角矩形背景 start
*------------------------------------*/
//边框的宽度
int strokeThickness = (int) (DEFAULT_STROKE_WIDTH_DIP*factor);
//圆角矩形背景的宽度
float radiusPx = *factor;
int backgroundHeight = (int) (*(radiusPx+strokeThickness));//2*(半径+边框宽度)
int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth + *factor + *strokeThickness) : backgroundHeight; canvas.save();//保存状态 ShapeDrawable drawable = getDefaultBackground2(context);
drawable.setIntrinsicHeight(backgroundHeight);
drawable.setIntrinsicWidth(backgroundWidth);
drawable.setBounds(, , backgroundWidth, backgroundHeight);
canvas.translate(iconSize-backgroundWidth-strokeThickness, *strokeThickness);
drawable.draw(canvas); canvas.restore();//重置为之前保存的状态 /**----------------------------------*
* TODO 绘制圆角矩形背景 end
*------------------------------------*/ //绘制数字
canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth+*strokeThickness)/), (float) (*factor+2.5*strokeThickness), numPaint);
}
return numIcon;
} /***
* 创建原生系统的快捷方式
* @param context
* @param clazz 启动的activity
* @param isShowNum 是否显示数字
* @param num 显示的数字:整型
* @param isStroke 是否加上边框
*/ 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);
} /***
* 是否已经创建了快捷方式
* @param context
* @return
*/
public static boolean isAddShortCut(Context context) {
Log.e(TAG, "isAddShortCut...."); boolean isInstallShortcut = false;
final ContentResolver cr = context.getContentResolver(); //TODO 注释的代码,在有的手机:修改了ROM的系统,不能支持
/*int versionLevel = android.os.Build.VERSION.SDK_INT;
String AUTHORITY = "com.android.launcher2.settings";
//2.2以上的系统的文件文件名字是不一样的
if (versionLevel >= 8) {
AUTHORITY = "com.android.launcher2.settings";
} else {
AUTHORITY = "com.android.launcher.settings";
}*/ 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() > ) {
isInstallShortcut = true;
} if(c != null){
c.close();
} Log.e(TAG, "isAddShortCut....isInstallShortcut="+isInstallShortcut); return isInstallShortcut;
} /**
* 删除快捷方式
* @param context
* @param clazz
*/
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, ""); }else {//其他原生系统手机
//删除显示数字的快捷方式
deleteRawShortCut(context, clazz);
//安装不显示数字的快捷方式
//installRawShortCut(context, clazz, false, "0");
}
} /***
* 删除原生系统的快捷方式
* @param context
* @param clazz 启动的activity
*/
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);
} /***
* 取得权限相应的认证URI
* @param context
* @param permission
* @return
*/
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;
} /***
* 在小米应用图标的快捷方式上加数字<br>
*
*
* @param context
* @param num 显示的数字:大于99,为"99",当为""时,不显示数字,相当于隐藏了)<br><br>
*
* 注意点:
* context.getPackageName()+"/."+clazz.getSimpleName() (这个是启动activity的路径)中的"/."不能缺少
*
*/
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 > ){
if (numInt > ){
num = "";
}
}else{
num = "";
}
}
localIntent.putExtra("android.intent.extra.update_application_message_text", num);
context.sendBroadcast(localIntent);
} /***
* 索尼手机:应用图标的快捷方式上加数字
* @param context
* @param num
*/
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 < ){
num = "";
isShow = false;
}else if (numInt > ){
num = "";
}
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);
} /***
* 三星手机:应用图标的快捷方式上加数字
* @param context
* @param num
*/
public static void samsungShortCut(Context context, String num)
{
int numInt = Integer.valueOf(num);
if (numInt < )
{
num = "";
}else if (numInt > ){
num = "";
}
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);
} /***
* 在应用图标的快捷方式上加数字
* @param clazz 启动的activity
* @param isShowNum 是否显示数字
* @param num 显示的数字:整型
* @param isStroke 是否加上边框
*
*/
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);
} } /***
* 取得当前应用的启动activity的名称:
* mainfest.xml中配置的 android:name:"
* @param context
* @return
*/
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, ).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;
} /***
* 得到一个默认的背景:圆角矩形<br><br>
* 使用代码来生成一个背景:相当于用<shape>的xml的背景
*
* @return
*/
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; }
/***
* 得到一个默认的背景:圆角矩形<br><br>
* 使用代码来生成一个背景:相当于用<shape>的xml的背景
*
* @return
*/
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; } /***
* 得到一个默认的背景:圆角矩形<br><br>
* 使用代码来生成一个背景:相当于用<shape>的xml的背景
*
* @return
*/
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;
} /***
* dp to px
* @param dip
* @return
*/
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 桌面图标添加数字角标
是否支持角标并不与手机厂商有关,而是你当前使用的launcher开发厂商有关. 方法实现: import android.app.Application; import android.app.Not ...
- HTML页面仿iphone数字角标
做仿iphone样式的数字角标,用简单的css来实现 <html><head><title>角标数字</title><style type=&qu ...
- ShortcutBadger添加桌面角标(Badge)
1.简介:角标原本是苹果的ios中的东西,android原生并不支持角标,因为google的意思是让大家用notification(提示栏)即可,不过无妨,厉害的android第三方厂商可以通过在自定 ...
- Android 图标右上角添加数字提醒
方法一:使用开源项目ViewBadger,github上的地址:https://github.com/jgilfelt/android-viewbadger 效果如图所示: <TextView ...
- ios uibutton加数字角标
http://www.jianshu.com/p/0c7fae1cadac 第一种:https://github.com/mikeMTOL/UIBarButtonItem-Badge第二种:https ...
- IOS开发 应用程序图标数字角标
其实实现这个功能很简单,只要调用UIApplication即可. 用法用例:[UIApplication sharedApplication].applicationIconBadgeNumber ...
- 在word文档中添加上角标和下角标
方法一 摘录:https://jingyan.baidu.com/article/02027811b4d2da1bcc9ce5f7.html 方法二 利用MathType数学公式编辑器 exe下载:h ...
- 【Android开发】APP桌面角标问题
Demo:https://github.com/baitutang1221/BadgeNumberManager 参考:https://juejin.im/post/59f2e59751882578c ...
- ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 本文主要使用的开源库是 leolin310148/ShortcutBadger,但是在其基础上做了一些修改. 什么是应用角标? 1. ...
随机推荐
- C#控制台程序本地化应用(Localization)
本地化在百度百科上的解释如下: “软件本地化是指将某一产品的用户界面(UI)和辅助材料(文档资料和在线帮助菜单)从其原产国语言向另一种语言转化,使之适应某一外国语言和文化的过程.” 其原理主要是把相同 ...
- USB学习小记-HID类键盘的报告描述符的理解
前言 断断续续的学习了将近三个月,才把USB的HID类搞明白,速度真是够慢的.利用晚上+周末的时间学习自己的东西确实是必要的,不过效率是有点低,以后要更专注一些才行,希望自己能做到吧. 在学习过程中, ...
- JS:函数多个参数默认值指定
函数有一个参数时,以往这样定义(参数为p1): function mfun(p1){ … } 当需要为p1设定一个默认值时 function mfun(p1){ if(p1===undefined) ...
- WIN_2003_SP2.iso VMware 不能进行网络访问的处理
1.打开IE发现不能上网的问题 ping命令 发现确实是网络不通: 2.关闭虚拟机设置网络适配器 3.ping命令验证是否设置成功 4.打开IE访问百度
- 电子科大POJ "整数的千位分隔"
整数的千位分隔 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) C-source ...
- linux服务器开发浅谈
[开发前准备] 在进行linux服务器开发之前,必须很清楚地了解所开发的对象需要考虑的相关问题比如:功能架构:提供服务的模块体系结构稳定性:服务器的出core率,内存泄露情况性能:请求与返回的速度与正 ...
- CURL 宏定义列表
摘自http://blog.csdn.net/msda/article/details/38047809/ CURL 宏定义列表 列表CURL库一共有17个函数 curl_close:关闭CURL会话 ...
- [转]中英文停止词表(stopword)
停止词,是由英文单词:stopword翻译过来的,原来在英语里面会遇到很多a,the,or等使用频率很多的字或词,常为冠词.介词.副词或连词等.如果搜索引擎要将这些词都索引的话,那么几乎每个网站都会被 ...
- 使用StoryBoard设置Scrollview的横向滚动不用一行代码
1).创建一个空工程Single类型的工程,然后打开故事版(StoryBoard)在ViewController上添加scrollview 2).然后对scrollview添加约束,上下左右全部都是0 ...
- c++崩溃错误2
使用了内联函数: 在头文件中声明和定义内联函数是正确的 但是在头文件中声明内联函数,而在.cpp文件中定义了内联函数会导致崩溃的 .h class stu{ inline void str(): } ...