Android 系统中,那些能大幅提高工作效率的 API 汇总(持续更新中...)

前言



“条条大路通罗马。”工作中,实现某个需求的方式往往不是唯一的,这些不同实现方式不仅表现在代码质量上,还影响着我们的工作效率。就像,在 Android 系统中,总有那么一些鲜为人知的 API 能够减少我们很多零碎的工作量。于是,就想凭着一些经验,整理一些常用的,找个地方归纳总结,也供日后翻阅。

getResources().getIdentifier(String name, String defType, String defPackage)



根据资源名称获取资源 id。正常情况下,我们会在代码中直接根据资源ID获取资源,比如:

getResources().getDrawable(R.drawable.ic_launcher);

但有时候,资源并不是固定的,需要根据使用情况从多个同类资源中动态选择,比如根据服务器传递给客户端的接口数据动态设置,怎么办呢?设置一个硬编码的映射关系数组?太繁琐!不妨用上这个方法。

一个完整的资源名为package:type/entry,对应该方法的三个参数:资源名称、资源类型、应用包名。举几个例子:

imageView.setImageResource(getResources().getIdentifier("ic_launcher", "drawable", getPackageName()));

radioGroup.check(getResources().getIdentifier("rb_indicator_" + position, "id", getPackageName()));

实际使用过程中,第一个参数 name,也就是资源名称,根据需要动态设置,这就需要多个资源在命名时保持一定的规范格式。另外,需要注意的是,直接通过 id 获取资源比通过名字的方式效率更高,所以,如果没有这般特殊需求的话,不提倡使用这个方法获取资源。

TextUtils.isEmpty(CharSequence str)



使用频率超高的字符串判空方法,返回一个 boolean 值,内部实现的判断条件为:str == null || str.length() == 0。备受开发人员喜爱的一个 if 字符串判断,系统已经帮我们封装过。

Html.fromHtml()



解析 Html 格式的富文本内容,并返回一个带样式的字符串,供 TextView 等控件显示。可以解决一些含超链接、图文混排等格式的富文本内容的显示问题。

DateUtils.formatDateTime()



利用 Android SDK 提供的这个日期工具类可以将 long 类型的毫秒级时间数据格式化成特定显示格式的字符串。通常我们使用 Java SDK 中的 SimpleDateFormat 格式化日期数据,比如 new SimpleDateFormat("yyyy-MM-dd HH:mm").format()DateUtils 的作用就是替我们封装了这个过程。格式化结果与当前设备的本地语言环境有关。这里列举几个常用 format 格式(中文环境下):

  • FORMAT_SHOW_DATE:3月3日
  • FORMAT_SHOW_TIME:10:37
  • FORMAT_SHOW_WEEKDAY:星期五
  • FORMAT_SHOW_YEAR:2017年3月3日
  • FORMAT_NUMERIC_DATE:3/3
  • FORMAT_NO_MONTH_DAY:三月

Formatter.formatFileSize(Context context, long sizeBytes)



格式化文件大小,将字节数据格式化为 B、KB、M 等单位的相应数据。context 参数用于判断返回结果的字符串顺序,right-to-left 还是 left-to-right 形式的。这个工具类免去我们自己转化计算的过程,非常方便,特别适用于应用内文件下载的类似场景。

TypedValue.applyDimension(int unit, float value, DisplayMetrics metrics)



将指定单位的尺寸数据按照当前设备屏幕信息转化为相应的像素值。其中,TypedValue 为第一个参数提供了常用的单位值,比如:

  • COMPLEX_UNIT_PX
  • COMPLEX_UNIT_DIP
  • COMPLEX_UNIT_PT
  • COMPLEX_UNIT_SP

源码如下:

public static float applyDimension(int unit, float value, DisplayMetrics metrics){
    switch (unit) {
    case COMPLEX_UNIT_PX:
        return value;
    case COMPLEX_UNIT_DIP:
        return value * metrics.density;
    case COMPLEX_UNIT_SP:
        return value * metrics.scaledDensity;
    case COMPLEX_UNIT_PT:
        return value * metrics.xdpi * (1.0f/72);
    case COMPLEX_UNIT_IN:
        return value * metrics.xdpi;
    case COMPLEX_UNIT_MM:
        return value * metrics.xdpi * (1.0f/25.4f);
    }
    return 0;
}

其实在实际使用过程中,像素值都是 int 整数类型,而该方法返回的是 float 类型,如果直接强制转换的话,会自动舍去小数部分。所以,如果不用该方法的话,通常我们会这么转换:

public static int convertDipToPx(Context context, int dip) {
    float scale = context.getResources().getDisplayMetrics().density;
    // 0.5f 用于向上取整
    return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));
}

Space



官方注释如下:

Space is a lightweight View subclass that may be used to create gaps between components in general purpose layouts.

Space 是一个用于创建视图之间空隙的轻量级 View。在 onDraw() 方法中不执行任何绘制,所以 android:background 属性对他来说不起作用。通常我们使用 View 创建视图间的空隙,在不考虑背景色的情况下,Space 其实效率更高。注意,由于是 API 14 引入的控件,如果需要向前兼容的话,需要使用到 support v4 包。

view.performClick()



自动调用 View 点击事件。通常按钮等控件只有在用户点击时才能触发其点击事件,该方法可以由某些特殊条件触发模拟用户点击行为。类似的还有 performLongClick() 方法。

Log.getStackTraceString(Throwable tr)



Log 类提供的一个公共静态方法,与常见的 Log.i() 等方法打印日志到 logcat 控制台不同的是,该方法从 Throwable 对象中获取错误信息,并以字符串的形式返回。当你需要做错误信息的数据持久化,比如保存至本地存储卡中或者上传至服务器时,利用这个方法就非常方便。

Linkify.addLinks()



我们知道对于 TextView 文本控件中的内容,通过 android:autoLink 属性可以为其添加诸如 web、phone 等固定模版的超链接点击事件。但毕竟系统模版有限,而利用 Linkify.addLinks() 方法可以添加一些应用内自定义模版,比如新浪微博中的 “@XXX” 格式的超链接跳转等,都可以通过自定义正则表达式来匹配处理。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)



设置安全窗口,禁用系统截屏。防止 App 中的一些界面被截屏,并显示在其他设备中造成信息泄漏。(常见手机设备系统截屏操作方式为:同时按下电源键和音量键。)

比如支付宝 App 的“向商家付款”的包含付款二维码的界面。(补充说明一点,微信付款界面不是这么做的,采用的是在 onResume() 生命周期方法中实时刷新付款二维码,与支付宝在安全方法采取的手段不同。)

拦截 Back 键,使 App 进入后台而不是关闭


  @Override
  public void onBackPressed() {
    Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
    launcherIntent.addCategory(Intent.CATEGORY_HOME);
    startActivity(launcherIntent);
  }

使用 Back 键返回桌面,但不关闭当前应用,而是使之进入后台,就像按下 Home 键一样。

这个技巧厉害了。通常为了防止出现用户误按 Back 键退出 App 的情况,我们会在应用首页的 Activity 中监听返回键操作,使用 Toast 弱提示甚至 Dialog 强提示的方式给到用户一个再次确认的操作,但无法阻止用户通过返回键逐步关闭应用。

然而,如果用这个方法拦截 App 最后一个 Activity(常见为首页界面),既没有阻碍用户操作(回到桌面),又没有关闭掉我们的应用(后台运行中),间接提高 App 的存活时间,真乃暗度陈仓。并且据我实验,微信、支付宝、微博等 App 都是这么做的,大家不妨一试。

ThumbnailUtils



缩略图工具类,可以根据本地视频文件源、Bitmap 对象生成缩略图,常用的公共静态方法为:

  • createVideoThumbnail(String filePath, int kind)
  • extractThumbnail(Bitmap source, int width, int height)

bitmap.extractAlpha()



从源 bitmap 中根据 alpha 获取一个新的 bitmap 对象。比较绕口,通常 App 中的 Icon 多数是纯色透明像素背景组成,利用这个方法可以对该图的非透明区域着色,有多种使用场景,常见如 Button 的 pressed 状态,View 的阴影状态等。举个例子:

private static Bitmap getDropShadow(ImageView iv, Bitmap src, float radius, int color) {

    final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(color);

    final int width = src.getWidth(), height = src.getHeight();
    final Bitmap dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(dest);
    final Bitmap alpha = src.extractAlpha();
    canvas.drawBitmap(alpha, 0, 0, paint);

    final BlurMaskFilter filter = new BlurMaskFilter(radius, BlurMaskFilter.Blur.OUTER);
    paint.setMaskFilter(filter);
    canvas.drawBitmap(alpha, 0, 0, paint);
    iv.setImageBitmap(dest);

    return dest;
}

ArgbEvaluator



系统提供的一个 TypeEvaluator ,我们只需要提供两个起始颜色值和一个分值,系统会通过特定的算法计算得出一个新的颜色中间值。利用这个类,我们至少可以做两件事情。

第一,用于属性动画中。由于其实现了 TypeEvaluator 接口,可以用来做自定义属性动画的求值器,改变 View 的显示状态。比如:

int colorStart = ContextCompat.getColor(this, R.color.black);
int colorEnd = ContextCompat.getColor(this, R.color.green);
ValueAnimator valueAnimator = ValueAnimator
    .ofObject(new ArgbEvaluator(), colorStart, colorEnd)
    .setDuration(3000);
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        textView.setTextColor((Integer) animation.getAnimatedValue());
    }
});
valueAnimator.start();

第二,利用该类提供的颜色求值算法,配合 ViewPager 提供的滑动偏离值使用。这种场景常见于使用 ViewPager 实现的引导页,其背景色随着滑动距离动态改变;使用 ViewPager 实现的 Tab 样式菜单页面,Tab 中文本内容随着滑动距离动态改变字体颜色(可以参考安卓版微信)。这两种使用都使得 ViewPager 页面切换过渡得很自然,体验极佳。如:

viewPager.addOnPageChangeListener(new OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        new ArgbEvaluator().evaluate(positionOffset, startColor, endColor);
    }

    @Override
    public void onPageSelected(int position) {

    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

另外,关于颜色差值的计算,Google Sample 里有另一种算法,可参考 SlidingTabStrip.java 文件源码,核心方法内容如下:


/**
* Blend {@code color1} and {@code color2} using the given ratio.
*
* @param ratio of which to blend. 1.0 will return {@code color1}, 0.5 will give an even blend,
*              0.0 will return {@code color2}.
*/
private static int blendColors(int color1, int color2, float ratio) {
    final float inverseRation = 1f - ratio;
    float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation);
    float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation);
    float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation);
    return Color.rgb((int) r, (int) g, (int) b);
}

android:weightSum



用于 LinearLayout 中,用于设置 Children weight 的总比重。在 LinearLayout 的 children 中,我们经常会使用 android:layout_weight 按比例分配容器布局的空间,但有时候不一定会分完。以往,有些朋友可能会使用一个空 放在最后来达到末尾占位效果。如果你知道这个属性的话,就能少写一些代码。

android:descendantFocusability



用于 ViewGroup 中,解决作为 Parent 的 ViewGroup 与 Children View 之间的焦点占用问题。最最常见的使用场景就是 list item 中含有一些点击效果的控件,比如 Button、CheckBox 等,相信大家都遇到过。取值有三种,含义就不用再多说了:

  • afterDescendants
  • beforeDescendants
  • blocksDescendants

android:duplicateParentState



是否将 View 自身的 drawable state 交给直接 parent ViewGroup 控制,值为 boolean 类型。比如有一个 item 布局,item 中有一个 button,如果点击 item layout 时,需要 button 呈现对应的点击效果,就可以在 button 中用到这个属性。不过,从设计的角度来讲,这种场景还是比较少见的。知道有这个属性就好,不推荐这种交互设计。

android:fillViewport



ScrollView 的一个属性,用于设置内容部分是否填满屏幕,主要针对内容不足以填满屏幕的情况。这里推荐一个使用技巧,参考我之前写的文章:Android 日常开发中,两个非常实用的布局技巧

android:adjustViewBounds



使用 ImageView 时,你可能会用 android:scaleType 属性设置图片缩放方式。殊不知,android:adjustViewBounds 属性也能起到类似的效果。但要注意的是,后者需要至少指定 ImageView 宽高中的一个属性,或者 maxHeight 之类的,然后另一个属性随之适配。这个属性用在列表中较为合适,比如 App 中的活动列表页面,图片宽度设置为 match_parent,然后高度设为 wrap_content 使其自适应,这样便能保证从服务获取的高分辨率图片在不同的屏幕中不被拉伸变形。(备注:最好在项目资源文件中放置一个与网络图片相同尺寸的默认图,起到 placeholder 作用,避免图片显示前高度为 0 的较差体验。)

持续更新中…



本文先记这么多吧,日积月累,后续持续更新中,敬请关注…(当然,你有什么高效而又少见的 API,欢迎一起分享交流哦~)

欢迎关注我的微信公众号



安卓笔记侠:专注于 Android 开发。

时间: 2024-10-18 10:39:21

Android 系统中,那些能大幅提高工作效率的 API 汇总(持续更新中...)的相关文章

Xcode编译异常和警告汇总(持续更新中)

1.Method definition for 'xxx' not found xxx的方法没有实现 出现原因.h声明了xxx方法但是.m没有实现xxx方法 解决方法:在类的.m文件实现xxx方法 2. Instance variable ‘xxx' accessed in class method  在类方法中访问了'xxx’实例变量 出现原因:在类方法中使用了实例变量 解决方法:如果真得需要在类方法中使用某个变量,可以把这个变量定义成全局变量,而不要实例变量,如在类方法外面定义变量(就是定义

痞子衡嵌入式:史上最强i.MX RT学习资源汇总(持续更新中...)

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MX RT学习资源. 类别 资源 简介 官方汇总 i.MXRT产品主页 恩智浦官方i.MXRT产品主页,最权威的资料都在这里,参考手册/数据手册,官方EVK板设计文件,各种应用笔记,各种参考设计方案.培训视频.软件SDK开发包,官方IDE/CFG工具,第三方软件支持等应有尽有,如果这上面文档你都能全部仔细看一遍,软件都能下载用起来,不用怀疑,你就是资深专家了. 其中痞子衡特别推荐你把所有应用笔记都看一遍,这些笔记凝结了所有恩智浦

《WCF技术剖析》博文系列汇总[持续更新中]

http://www.cnblogs.com/artech/archive/2009/11/21/1607686.html 近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析(卷1)>的写作,一直无暇管理自己的Blog.在<WCF技术剖析(卷1)>写作期间,对WCF又有了新的感悟,为此以书名开始本人的第三个WCF系列.本系列的目的在于对<WCF技术剖析>的补充,会对书中的一些内容进行展开讲述,同时会囊括很多由于篇幅的原因忍痛割弃的内容. [第1篇] 通过一个ASP

Outlook2013中三个有助于提高工作效率的使用技巧

一.搜索文件夹 在Outlook中除了预定义的像收件箱.已发送邮件等文件夹外,我们还可以通过设定搜索条件添加自定义文件夹,如下图所示, 右键点击搜索文件→新建搜索文件夹 预定义搜索文件夹 打开新建搜索文件夹对话框,这里已经预设几个搜索条件,例如未读邮件按.含有附件的邮件.重要邮件等等,选择一个后点击确定就创建好搜索文件夹了. 继续阅读>>

史上最详细Android集成QQ,微信,微博分享(不用第三方)持续更新中

QQ 1 下载sdk并运行demo 2 各种配置 IUiListener 4 分享图片 41 分享到QQ 41 分享到QZONE Sina微博 配置 选择集成sdk方式 分享图片 现在项目中用个第三方登录,或分享已经不是什么稀奇事了,但是要想把这个功能做好,那可就不容易了.估计到这里就有人会说了,扯犊子,这玩意,我用第三方sdk,什么umeng,sharesdk分分钟给你做出来,可是这些第三方sdk只有对项目的分享要求不高的时候才适合,如果要定制分享,那我就只能呵呵.虽然第三方登录或分享没什么技

提高工作效率的工具(随时更新)

搜索类: Everything  免费,高效地查找文件.特点是快,速度真的非常快,基本都是即时出结果.有了这个再也不用windows自带搜索.功能扩展性也好,掌握好了,功能非常强大.可以说是任何windows用户的必备 桌面整理类: CLaunch  图形化,简单易用的图标归类,占用内存极少,速度快,可以设置成桌面双击才出现,洁癖必备 AltRun  用键盘调用各种软件,需要自己预先设置,程序员比较喜欢 批量处理类: BulkRenameUtility  批量重命名软件,功能很强,操作简单,非常

软件测试之面试汇总(持续更新中)

1. 软件的生命周期(prdctrm) 计划阶段(planning) -> 需求分析(requirement) -> 设计阶段(design) -> 编码(coding) -> 测试(testing) -> 运行与维护(running maintrnacne) 2. 在测试中发现了一个bug,但是开发经理认为这不是一个bug,你应该怎样解决? 1.将问题提交到缺陷管理库里面进行备案. 2.要获取判断的依据和标准: 3.根据需求说明书.产品说明.设计文档等,确认实际结果是否与计

[Linux] PuTTY指令汇总(持续更新中...)

写在前面: 以前真心没有玩过Linux系统,总感觉整天摆弄Linux的同学都是大牛.如今,在公司里实习需要远程登录Linux服务器,所有的代码都要在开发板上完成,所以被逼无奈也不得不定下心来好好学学Linux系统的各种操作.我现在用的远程登录软件是PuTTY,所以简单总结一下常用的PuTTY指令,方便以后进行查阅. 1. PuTTY介绍 随着Linux在服务器端应用的普及,Linux系统管理越来越依赖于远程.在各种远程登录工具中,PuTTY是出色的工具之一.PuTTY是一个免费的.Windows

sourceInsight使用小技巧汇总--持续更新中

作为测试人员,读各种平台的工程代码时,根本不想安装各种vs或者eclipse等,于是,就找了一款代码阅读工具. sourceInsight,下载地址为官网:http://www.sourceinsight.com/ 那么,问题就来了,sourcinsight的界面风格呀,真真不习惯,而且打开代码文件的时候没有文件标签. 于是,就百度呀 总结一些设置小技巧 设置前打开新建project后打开时这样的 一. Source Insight中文字体设置 Source Insight是一个面向项目开发的程