Android系统中,能大幅提高工作效率的API汇总

来源:互联网 发布:excel统计一列数据个数 编辑:程序博客网 时间:2024/05/22 11:46
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(getResouces().getIdentifier("rb_indicator_" + position, "id", getPackageName())); 注意: 通过id获取会比通过名字获取效率更高, 不过有特殊需求才考虑使用名字获取.

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

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

DateUtils.formatDateTime()
利用AndroidSDK提供的这个日期工具类将long类型的毫秒级时间数据格式化成特定显示格式的字符串.通常我们使用JavaSDK中的SimpleDateFromat格式化日期数据, 比如new SimpleDateFormat("yyyy-MM-dd HH:mm").format(), DateUtils的作用就是替我们封装了这个过程.格式化结果和当前设备的本地语言环境有关. 这里列举几个常用的format格式:
FORMAT_SHOW_DATE: 3月3日
FORMAT_SHOW_TIME: 10:37
FORMAT_SHOW_WEEKDY: 星期五
FORMAT_SHOW_YEAR: 2017年3月3日
FORMAT_NUMERIC_DATE: 3/3
FORMAT_NO_MONTH_DAY: 三月
(
Android 时间、日期处理 DateUtils、SystemClock、DateFormat

Java中常用的 时间 日期 class:  
  java.util.Date
  java.util.Calendar
  java.text.DateFormat
  java.text.SimpleDateFormat
 还有个获取系统时间的方法 System.currentTimeMillis();

Android中的:
  android.os.SystemClock
  android.text.format.DateFormat
  android.text.format.DateUtils

android.os.SystemClock 
  SystemClock.elapsedRealtime();  //系统启动后过了多长时间(毫秒值,含系统深度睡眠时间)
  所谓android深度睡眠,即屏幕关闭后,一段时间不做任何操作,不连接usb,然后在一定时间后,
  系统很多服务、进程都睡眠了,不再运行。
  SystemClock.uptimeMillis();  //系统启动后过了多长时间(毫秒值,不含系统深度睡眠时间)
  SystemClock.currentThreadTimeMillis(); //当前线程运行了多少时间(毫秒值,不含thread或systemclock.sleep的值)
  
android.text.format.DateFormat 
  DateFormat.format("yyyy-MM-dd HH:mm:ss", System.currentTimeMillis()); 
  DateFormat.format("yy/MM/dd", Calendar.getInstance());
  DateFormat.format("yyyy", new Date(2048,12,01));
  直接根据格式,格式时间   (关于格式,类中有定义)

android.text.format.DateUtils
  DateUtils.formatDateTime(getApplicationContext(), //格式化时间,最多显示到分钟。最后参数设定显示的格式
                        System.currentTimeMillis(),
                        DateUtils.FORMAT_24HOUR|DateUtils.FORMAT_SHOW_DATE|DateUtils.FORMAT_SHOW_TIME
                                |DateUtils.FORMAT_SHOW_YEAR|DateUtils.LENGTH_LONG|DateUtils.FORMAT_ABBREV_MONTH);
  DateUtils.getRelativeTimeSpanString(System.currentTimeMillis()+60*4000)); 
             //返回相对于当前时间的最大区间表示的字符串:几(分钟,小时,天,周,月,年)前/后
 DateUtils.getRelativeTimeSpanString(context, long timeMillis); 
        //返回相对于当前时间的,参数时间字符串:在同一天显示时分;在不同一天,显示月日;在不同一年,显示年月日
 DateUtils.formatDateRange(getApplicationContext(), System.currentTimeMillis(), System.currentTimeMillis() + 60 * 60 * 3000,
                        DateUtils.FORMAT_SHOW_TIME));  //返回两个时间值间的 相距 字符串
)



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
源码如下:
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, intdip){
floatscale = context.getResources().getDisplayMetrics().desity; // desity为一英寸屏幕像素密度的比例值 (desity = 120 / 160 160/160)
// 0.5f用于向上取整
}

Space
Space是一个用于创建视图之间空隙的轻量级View, 在onDraw()方法中不执行任何绘制, 所以android:background属性对他来说不起作用. 通常我们使用View创建视图间的空隙, 在不考虑背景色的情况下, Space其实效率更高.(Space作间隙的效率比View更高,在不用android:background属性下)

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中的一些界面被截屏, 并显示在其他设备中造成信息泄露.(android常用的截屏键)

拦截Back键, 使App进入后台而不是关闭(微信,支付宝,微博都是这样做的,相当于按下Home键)
@Override
public void onBackPressed(){
Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
launcherIntent.addCategory(Intent.CATEGORY_HOME);
startActivity(launcherIntent); // 会跳转到隐式意图的Intent.CATEGORY_HOME的Activity上
// setClass为显式意图, addCategory()是隐式意图,会匹配的
}
使用Back键返回桌面,但不关闭当前应用,而是使之进入后台,就像按下Home键一样.
这个技巧可厉害了. 通常为了防止出现用户误按Back键退出App的情况, 我们会在应用首页的Activity中监听返回键操作, 使用Toast弱提示甚至Dialog强提示的方式给到用户一个再次确认的操作,但无法阻止用户通过返回键逐步关闭应用.
然而,如果用这个方法拦截App最后一个Activity(常见为首页界面),既没有阻碍用户操作(回到桌面),又没有关闭掉我们的应用(后台运行中), 间接提高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 BitmapgetDropShadow(ImageView iv, Bitmap src, float radius, intcolor){
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 (Argb计算求值程序)
系统提供的一个TypeEvaluator, 我们只需要提供两个起始颜色值和一个分值,系统会通过特定的算法计算得出一个新的颜色中间值.利用这个类,我们至少可以做两件事情:
第一, 用于属性动画中. 由于其实现了TypeEvaluator接口, 可以用来做自定义属性动画的求值器, 改变View的显示状态. 比如:
intcolorStart = ContextCompat.getColor(this, R.color.black);
intcolorEnd = 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实现的引导页,其背景色随着滑动距离动态改变字体颜色(可以参考android版微信). 这两种使用都使得ViewPager页面切换过度得很自然,体验极佳. 如:
ViewPager.addOnPageChangeListener(new OnPageChangeListener(){
@Override
public void onPageScrolled(int position,float positonOffset, int positionOffsetPixels){
new ArgbEvaluator().evaluate(positionOffset, startColor, endColor);
}
@Override
public void onPageSelected(int position){}
@Override
public void onPageScrollStateChanged(int state){}
});
另外关于颜色差值的计算,Google Sample里有另一种算法, 可参考SlidingTabStrip.java文件源码,核心方法内容如下:
private static int blendColors(int color1, int color2, float ratio){
final float inverseRation = 1f - ratio; // ratio是一个float值, 然后inverseRation是一个转换值
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);
}





阅读全文
0 0
原创粉丝点击