Android所有系统资源图标android.R.drawable.xxx查看(纯java)

本文介绍了一款用于查看Android系统自带资源文件的软件,包括图标ID、尺寸等信息,帮助开发者在编程中轻松引用系统提供的图片文件,节省人力并减小软件包大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编程的时候,我们经常要用到android的系统资源图标,一般都是引用其id如android.R.drawable.xxx。该资源名字能够很方便的服务我们引用,但是有一些图片名字接近,我们不知道该选哪个好。为此,本人设计了一个软件用于查看系统所带的所有资源文件。我们先通过API查看android.R.drawable文档,第一个是alert_dark_frame,其值为0x01080000,最后一个为zoom_plate,其值为0x01080097,这些值并非连续的,中间有些值是没有图标与之对应的,但这并不影响我们设计视图。我们通过GridView来展示所有资源,标题显示图片id和尺寸,运行效果图如下图所示。有了这个软件,我们在以后的编程中也可以随时引用系统提供图片文件,不但节省了人力去设计图标,而且还可以在很大程度上减少了软件包的大小。

软件下载地址:http://download.youkuaiyun.com/detail/mrlixirong/3609840

    

AndroidRDrawable.java代码

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.*;
import android.widget.*;
import android.widget.AdapterView.*;

public class AndroidRDrawable extends Activity {
	
	private AndroidRDrawable ard=this;
	private LinearLayout mainView=null;
	private TextView tv=null;
	private GridView gv=null;
	private int id=0x01080000;
	
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainView=new LinearLayout(this);
        mainView.setOrientation(LinearLayout.VERTICAL);
        tv=new TextView(this);
        tv.setText("这里显示图标名称和id及其尺寸");
        gv_init();
        mainView.addView(tv);
        mainView.addView(gv);
        setContentView(mainView);
    }
    
    /*gv初始化*/
    void gv_init(){
    	gv=new GridView(this);
    	GridView.LayoutParams lp=new GridView.LayoutParams(-1,-1);
    	gv.setLayoutParams(lp);
    	gv.setNumColumns(GridView.AUTO_FIT);
    	gv.setVerticalSpacing(10);
    	gv.setHorizontalSpacing(10);
    	gv.setAdapter(new ImageAdapter(this));
    	gv.setFocusableInTouchMode(true);
    	gv.setOnItemClickListener(new OnItemClickListener(){
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
				tv.setText("图标名称:"+ard.getResources().getResourceEntryName(0x01080000+arg2)+"\n");
				tv.append("图标Id:0x"+Integer.toHexString(0x10800000+arg2)+"\n");
				tv.append("图标大小:"+arg1.getWidth()+"x"+arg1.getHeight()+"\n");
			}
    	});
    	gv.setOnItemSelectedListener(new OnItemSelectedListener(){
			public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) {
				tv.setText("图标名称:"+ard.getResources().getResourceEntryName(0x01080000+arg2)+"\n");
				tv.append("图标Id:0x"+Integer.toHexString(0x10800000+arg2)+"\n");
				tv.append("图标大小:"+arg1.getWidth()+"x"+arg1.getHeight()+"\n");
			}
			public void onNothingSelected(AdapterView<?> arg0) {
			
			}
    	});
    }
    
    class MyThread extends Thread{
    	
    }
    
    /*ImageAdapter*/
    public class ImageAdapter extends BaseAdapter {

    	private Context context;
    	
    	public ImageAdapter(Context c) {context = c;}
    	
    	public int getCount() {return 152;}
    	public Object getItem(int position) {return position;}
    	public long getItemId(int position) {return position;}

    	public View getView(int position, View convertView, ViewGroup parent) {
    		ImageView iv = new ImageView(context);
    		iv.setLayoutParams(new GridView.LayoutParams(-2,-2));
    		id=0x01080000+position;
    		iv.setImageResource(id);
    		iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
    		return iv;
    	}
    }
}

<think>嗯,用户问的是Android系统源码中的桌面图标形状。我需要先回忆一下Android系统在这方面的处理机制。首先,Android的桌面属于Launcher应用的一部分,而不同的设备厂商可能有自己的定制Launcher,比如小米的MIUI、华为的EMUI等。这些厂商通常会修改Launcher的源码来自定义图标形状。 接下来,图标形状的控制可能涉及多个方面。比如,系统默认的图标形状可能在某个资源文件中定义,或者在运行时根据主题动态调整。我记得Android 8.0(API 26)引入了自适应图标(Adaptive Icons),允许开发者提供不同形状的图标,而系统会根据设备设置来裁剪显示。这可能是在framework/base的某个部分处理的,比如在IconLoader或者Launcher3的代码里。 然后,用户可能需要知道如何查找相关的源码。我应该建议他们查看AOSP中的packages/apps/Launcher3模块,特别是处理图标绘制的部分,比如IconCache或BubbleTextView。另外,资源文件中的图标形状可能引用了XML定义的形状,比如在res/drawable目录下的某个文件,使用了<shape>标签。 还需要考虑不同Android版本之间的差异。比如在Android 8.0之前,图标形状可能由Launcher直接控制,之后则使用自适应图标。此外,系统主题也可能影响图标形状,用户可能通过系统设置更改图标风格,这涉及到主题引擎和资源叠加机制(Overlay)。 另外,厂商自定义的部分可能需要查看厂商的Launcher源码,这部分通常不在AOSP中。不过用户如果只是想了解原生Android的实现,可以专注于AOSP的Launcher3和相关类。例如,AdaptiveIconDrawable类负责处理自适应图标的绘制和裁剪路径。 总结一下,回答应该分步骤说明Android如何处理桌面图标形状,涉及的关键类和资源文件,以及不同版本和厂商的影响。同时需要指导用户如何查找相关源码,并提到自适应图标的概念和实现方式。</think>在 Android 系统源码中,桌面图标形状的控制主要涉及以下核心模块和机制: $\boxed{\text{关键实现步骤解析}}$ 1. $\text{Launcher3 模块}$ - 路径:`packages/apps/Launcher3` - 原生 Android 的桌面实现模块 - 核心类: - `BubbleTextView`:负责图标渲染 - `IconCache`:管理图标缓存 - `AdaptiveIconDrawable`:处理自适应图标形状 2. $\text{形状控制机制}$ ```java // 代码示例:Launcher3 的图标形状配置 <!-- res/values/config.xml --> <resources> <item name="default_icon_mask" format="path">@string/icon_mask</item> </resources> <!-- res/values/strings.xml --> <string name="icon_mask" translatable="false">M50,0L100,50 L50,100 L0,50 L50,0</string> ``` 通过 SVG path 定义蒙版形状,默认正方形路径为 `M50,0L100,50 L50,100 L0,50 L50,0` 3. $\text{自适应图标 (API 26+)}$ ```xml <!-- AndroidManifest.xml --> <application android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round"> ``` 系统通过 `AdaptiveIconDrawable` 实现动态裁剪: $$\text{最终形状} = \text{系统蒙版} \otimes (\text{前景层} \oplus \text{背景层})$$ 4. $\text{系统级重写方法}$ ```java // 在 DeviceDefault 主题中重写 <style name="Theme.DeviceDefault"> <item name="android:windowIconMask">@drawable/icon_mask_override</item> </style> ``` 设备厂商通过 overlay 机制覆盖 `config_icon_mask` 实现定制 $\boxed{\text{不同实现方案对比}}$ | 方案类型 | 实现路径 | 影响范围 | 兼容性要求 | |-----------------|-----------------------------------|----------------|-------------| | 原生配置 | packages/apps/Launcher3 | 仅 AOSP 桌面 | API 26+ | | 系统主题覆盖 | frameworks/base/core/res | 全局生效 | 需要 root | | 厂商自定义 | vendor/xxx/overlay/Launcher3 | 特定设备 | 依赖 ROM | $\boxed{\text{调试技巧}}$ - 使用命令 `adb shell setprop debug.layout true` 查看图标蒙版边界 - 在开发者选项中开启「强制启用桌面图标蒙版」 - 通过 `dumpsys activity service com.android.launcher3` 获取当前配置 建议通过 AOSP 代码搜索以下关键符号进行深入分析: $$\text{ICON\_MASK\_RESOURCE} \in \text{IconLoader.java}$$ $$\text{SHAPE\_PATH} \in \text{AdaptiveIconDrawable.java}$$
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李工电子说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值