Android开发常见实用API(二)

本文深入解析Android开发中26个关键技巧与最佳实践,涵盖从基本概念到高级应用,包括事件处理、动画、界面设计、性能优化、内存管理等多个方面。从如何高效地使用HandlerThread到如何利用GradientDrawable实现复杂视觉效果,本文提供了丰富的实战经验和代码示例,旨在帮助开发者提升Android应用开发能力。

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

紧接着上一篇文章不重复的:

1、getParent().requestDisallowInterceptTouchEvent(true);剥夺父view对touch事件的处理权,谁用谁知道。

2、ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue);用于根据一个起始颜色值和一个结束颜色值以及一个偏移量生成一个新的颜色,分分钟实现类似于微信底部栏滑动颜色渐变。

3、Canvas中clipRect、clipPath和clipRegion剪切区域的API。

4、Bitmap.extractAlpha ();返回一个新的Bitmap,capture原始图片的alpha值。有的时候我们需要动态的修改一个元素的背景图片又不希望使用多张图片的时候,通过这个方法,结合Canvas和Paint可以动态的修改一个纯色Bitmap的颜色。

5、HandlerThread,代替不停new Thread开子线程的重复体力写法。

6、IntentService,一个可以干完活后自己去死且不需要我们去管理子线程的Service。

7、Palette,5.0加入的可以提取一个Bitmap中突出颜色的类,结合上面的Bitmap.extractAlpha,你懂的。

8、Executors. newSingleThreadExecutor();这个是java的,之前不知道它,自己花很大功夫去研究了单线程顺序执行的任务队列。。

9、android:animateLayoutChanges="true",LinearLayout中添加View的动画的办法,支持通过setLayoutTransition()自定义动画。

10、ViewDragHelper,自定义ViewGroup处理各种事件很累吧,嗯? what the fuck!!

11、GradientDrawable,之前接手公司的项目,发现有个阴影效果还不错,以为是切的图片,一看代码,什么鬼= =!

12、AsyncQueryHandler,如果做系统工具类的开发,比如联系人短信辅助工具等,肯定免不了和ContentProvider打交道,如果数据量不是很大的情况下,随便搞,如果数据量大的情况下,了解下这个类是很有必要的,需要注意的是,这玩意儿吃异常..

13、ViewFlipper,实现多个view的切换(循环),可自定义动画效果,且可针对单个切换指定动画。

14、有朋友提到了在自定义View时有些方法在开启硬件加速的时候没有效果的问题,在API16之后确实有很多方法不支持硬件加速,通常我们关闭硬件加速都是在清单文件中通过<application android:hardwareAccelerated="false" ...>,其实android也提供了针对特定View关闭硬件加速的方法,调用View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);即可。

15、android util包中的Pair类,可以方便的用来存储一"组"数据。注意不是key value。

16、PointF,graphics包中的一个类,我们经常见到在处理Touch事件的时候分别定义一个downX,一个downY用来存储一个坐标,如果坐标少还好,如果要记录的坐标过多那代码就不好看了。用PointF(float x, float y);来描述一个坐标点会清楚很多。

17、StateListDrawable,定义Selector通常的办法都是xml文件,但是有的时候我们的图片资源可能是从服务器动态获取的,比如很多app所谓的皮肤,这种时候就只能通StateListDrawable
来完成了,各种addState即可。

18、android:descendantFocusability,ListView的item中CheckBox等元素抢焦点导致item点击事件无法响应时,除了给对应的元素设置 focusable,更简单的是在item根布局加上android:descendantFocusability=”blocksDescendants”

19android:duplicateParentState="true",让子View跟随其Parent的状态,如pressed等。常见的使用场景是某些时候一个按钮很小,我们想要扩大其点击区域的时候通常会再给其包裹一层布局,将点击事件写到Parent上,这时候如果希望被包裹按钮的点击效果对应的Selector继续生效的话,这时候duplicateParentState就派上用场了。

20、includeFontPadding="false",TextView默认上下是有一定的padding的,有时候我们可能不需要上下这部分留白,加上它即可。

21、Messenger,面试的时候通常都会被问到进程间通信,一般情况下大家都是开始背书,AIDL巴拉巴拉。。有一天在鸿神的博客看到这个,嗯,如他所说,又可以装一下了。

22、TextView.setError();用于验证用户输入。

23、ViewConfiguration.getScaledTouchSlop();触发移动事件的最小距离,自定义View处理touch事件的时候,有的时候需要判断用户是否真的存在movie,系统提供了这样的方法。

24、ValueAnimator.reverse(); 顺畅的取消动画效果。

25、ViewStub,有的时候一块区域需要根据情况显示不同的布局,通常我们都会通过setVisibility的方法来显示和隐藏不同的布局,但是这样默认是全部加载的,用ViewStub可以更好的提升性能。

26、onTrimMemory,在Activity中重写此方法,会在内存紧张的时候回调(支持多个级别),便于我们主动的进行资源释放,避免OOM。

27、EditTxt.setImeOptions, 使用EditText弹出软键盘时,修改回车键的显示内容(一直很讨厌用回车键来交互,所以之前一直不知道这玩意儿)

28、TextView.setCompoundDrawablePadding,代码设置TextView的drawable padding。

29、ImageSwitcher,可以用来做图片切换的一个类,类似于幻灯片。

30、java8中新增的LocalDate和LocalTime接口,Date虽然是个万能接口,但是它真的不好用,有了这俩,终于可以愉快的处理日期时间了。

31、WeakHashMap,直接使用HashMap有时候会带来内存溢出的风险,使用WaekHashMap实例化Map。当使用者不再有对象引用的时候,WeakHashMap将自动被移除对应Key值的对象。




说几个简单但是基础的吧

selector用这个来做样式的多态真是没有太方便了,以前傻傻的自己分析事件来变换

HierarchyViewer这个工具用来了解界面实现方式,找到每个view布局和对应id实在太方便了,还可以配合dumpsys命令用来调试

ListView ViewHolder的使用,虽说现在RecyclerView已经把ViewHolder包含进去了,但是还是要说说这个方法对于复用的意义

moveTaskToBack 看到很多论坛写模拟home按键的方式是用Intent.setAction(Intent.ACTION_MAIN)来实现所谓模拟home键的方式(实际上是调用launcher),其实很多场景里面要这么做的主要目的就是为了让当前的APP隐藏而非退出,但是用Intent方法其实并不是那么优雅,刚才说了这个方法的实质是调用launcher,会导致所有应用全部转到后台,最近在做Android多任务相关工作,这么做对于系统开发者和其他应用造成不小的困扰,其实在activity层面调用moveTaskToBack就可以搞定了

setSystemUiVisibility和setStatusBarColor要实现status bar的透明或者颜色用这两个接口就可以了,透明只需要设置SystemUiVisibility为View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE,颜色的话调用后面那个接口就可以,看到某某云音乐用系统id status_bar_height高度各种计算,自己绘制来实现对于status bar的染色也是最了

loader和ContentObserver 实现数据于控制机制分离的非常好的结构,Android原生邮件系统使用了大量的这样的模式,来处理繁杂的邮件相关的信息内容,加载邮件服务器内容到数据库以及UI上的显示更新完全是两条路




我也添一些,如有雷同纯属巧合~

1. 通过 WindowManager.addView 在其他app界面添加一个view时,经常会无法显示,特别在miui,emui固件上,需要指定type为LayoutParams.TYPE_TOAST。

2. View.getLocationOnScreen(new int[]),获取view在屏幕上的位置

3. Paint.setXfermode(porterDuffXfermode),在ApiDemo里面有专门的介绍,实现了穿透,叠加,覆盖等多种绘制效果,非常实用

4. IBinder binder = ServiceManager.getService("wallpaper");
   IWallpaperManager wm = IWallpaperManager.Stub.asInterface(binder);
   Bundle params = new Bundle();
   ParcelFileDescriptor fd = wm.getWallpaper(stub, params);
   直接获取当前系统壁纸的fd,避免壁纸过大造成oom问题。这种方式有适配问题,需注意。

5. 通过View.getDrawingCache()可以获取截图,但是需要setDrawingCacheEnabled(true)频繁使用可能会oom,还有一种方法直接用canvas
Bitmap bm = Bitmap.createBitmap((int) (w * scale), (int) (h*scale), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas();
canvas.setBitmap(bm);
View.draw(canvas);
return bm;

6. 说到几个oom,顺带说下有一种偷懒又有效的解决办法,在manifest上加android:largeHeap="true"

7. 用一个牛逼的来结尾,AccessibilityService。由于强大所以需要手动设置来启用,各种消息获取各种状态拦截,豌豆荚就用ta实现了非root自动安装。




1、android.support.design.widget.TextInputLayout,给EditText带个套吧⊙▽⊙
2、AndroidMainfest.xml activity的一些标签,比如android:windowSoftInputMode
        <activity android:name=".Main" 
                 android:label="@string/app_name" 
                 android:windowSoftInputMode="stateHidden" > 
           <intent-filter> 
               <action android:name="android.intent.action.MAIN" /> 
               <category android:name="android.intent.category.LAUNCHER" /> 
           </intent-filter> 
       </activity> 

activity launch后默认隐藏键盘,这在activity里面有EditText等元素又不想一开始就弹出软键盘的情况下有用,在此之前就知道android:name 和android.label这两个属性_(:3」∠)_
3、getSystemService函数,获取各种系统service,而且不用担心性能问题,都是直接返回各种manager。
4、Parcelable接口
原来受MFC等c++类库影响,比较习惯继承serialiabe接口这种方式,但后来知道了Parcelable的实现方式就喜欢上了。
5、android.support.v4.widget.DrawerLayout
原生大方的抽屉控件。
6、android.support.v7.widget.Toolbar
定制性极强的viewGroup


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值