Android 自定义通知Notification 适配不同背景颜色
程序员文章站
2022-07-13 15:39:06
...
自定义通知
自定义通知首先明确一点是要用RemoteViews来设置布局
PendingIntent remotePending=PendingIntent.getActivity(MainActivity.this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews contentView=new RemoteViews(getPackageName(), R.layout.remoteview);
contentView.setTextViewText(R.id.share_content, "这是自定义的view");
contentView.setOnClickPendingIntent(R.id.share_facebook, remotePending);
contentView.setOnClickPendingIntent(R.id.share_twitter, remotePending);
RemoteViews bigContentView=new RemoteViews(getPackageName(), R.layout.bigcontentview);
bigContentView.setTextViewText(R.id.share_content, "这是自定义的view");
bigContentView.setOnClickPendingIntent(R.id.share_facebook, remotePending);
bigContentView.setOnClickPendingIntent(R.id.share_twitter, remotePending);
- RemoteViews适配
public static boolean isDarkNotificationTheme(Context context) {
return !isSimilarColor(Color.BLACK, getNotificationColor(context));
}
/**
* 获取通知栏颜色
* @param context
* @return
*/
public static int getNotificationColor(Context context) {
NotificationCompat.Builder builder=new NotificationCompat.Builder(context);
Notification notification=builder.build();
int layoutId=notification.contentView.getLayoutId();
ViewGroup viewGroup= (ViewGroup) LayoutInflater.from(context).inflate(layoutId, null, false);
if (viewGroup.findViewById(android.R.id.title)!=null) {
return ((TextView) viewGroup.findViewById(android.R.id.title)).getCurrentTextColor();
}
return findColor(viewGroup);
}
private static boolean isSimilarColor(int baseColor, int color) {
int simpleBaseColor=baseColor|0xff000000;
int simpleColor=color|0xff000000;
int baseRed=Color.red(simpleBaseColor)-Color.red(simpleColor);
int baseGreen=Color.green(simpleBaseColor)-Color.green(simpleColor);
int baseBlue=Color.blue(simpleBaseColor)-Color.blue(simpleColor);
double value=Math.sqrt(baseRed*baseRed+baseGreen*baseGreen+baseBlue*baseBlue);
if (value<180.0) {
return true;
}
return false;
}
private static int findColor(ViewGroup viewGroupSource) {
int color=Color.TRANSPARENT;
LinkedList<ViewGroup> viewGroups=new LinkedList<>();
viewGroups.add(viewGroupSource);
while (viewGroups.size()>0) {
ViewGroup viewGroup1=viewGroups.getFirst();
for (int i = 0; i < viewGroup1.getChildCount(); i++) {
if (viewGroup1.getChildAt(i) instanceof ViewGroup) {
viewGroups.add((ViewGroup) viewGroup1.getChildAt(i));
}
else if (viewGroup1.getChildAt(i) instanceof TextView) {
if (((TextView) viewGroup1.getChildAt(i)).getCurrentTextColor()!=-1) {
color=((TextView) viewGroup1.getChildAt(i)).getCurrentTextColor();
}
}
}
viewGroups.remove(viewGroup1);
}
return color;
}
这里有几个注意点
- TextView textView= (TextView) viewGroup.findViewById(android.R.id.title);可能在有的手机上获取textview为空,所以我想notification的文本区域,系统默认肯定有一个值的,那我就直接遍历找到这个值即可
这样你就可以通过
contentView.setInt(R.id.share_content, "setTextColor", NotificationUtils.isDarkNotificationTheme(MainActivity.this)==true?Color.WHITE:Color.BLACK);
实现颜色替换的功能,setInt、setString的功能是通过反射进行操作的。
http://www.jianshu.com/p/426d85f34561
下一篇: 自定义View-View的构造函数