做 Android 开发的小伙伴们,是不是总在这些地方栽跟头?系统自带的控件长得太普通,想做个个性按钮或进度条,改来改去都不满意;APP 界面滑动时一卡一卡的,日志里一堆红色警告却找不到原因;升级到 Android 14 后,之前好好的 APP 突然闪退,权限申请也弹个不停。别着急,兔子哥太懂这种感受了!之前做一个音乐 APP,想做个圆形进度条,继承 View 写了半天,要么画不圆要么滑动卡顿;还有一次 Android 14 刚出来,急忙把 APP 升级上去,结果因为没适配新的权限机制,用户一打开就崩,评论区全是差评。今天就带大家把自定义控件开发、性能优化和 Android 14 适配技巧讲透,实战干货满满,新手跟着学少走弯路,一起往下看吧!
一、自定义控件开发:想要个性界面?这 3 步让控件听话
基础问题:啥是自定义控件?系统控件不够用吗?
系统控件比如 Button、TextView 确实够用,但做个性化界面时就不够了。比如音乐 APP 的圆形进度条、电商 APP 的星级评分控件,系统里没有现成的,这时候就得自己做自定义控件。简单说,自定义控件就是根据需求改造或全新创建的控件,想让它长啥样、咋响应点击,全由你说了算,对吧?
开发自定义控件 3 种方式,新手选对少踩坑
组合现有控件(最简单,推荐新手)
不用从零开始画,把系统控件拼起来就行。比如做个带文字的图片按钮,用 LinearLayout 包裹 ImageView 和 TextView,再写点样式,就是一个自定义控件了。
步骤:创建 layout 文件,布局好子控件;
新建类继承 LinearLayout,在构造方法里加载布局;
暴露方法给外部设置数据,比如
fun setData(text: String, imgRes: Int)。
优点:简单易上手,不用处理复杂的测量和绘制,兼容性还好。继承系统控件改造
系统控件基础上改功能,比如给 Button 加个点击动画。继承 Button 后,重写 onTouchEvent 方法,在按下和抬起时改变背景或大小。
例子:给按钮加缩放效果
kotlinclass ScaleButton(context: Context, attrs: AttributeSet) : Button(context, attrs) {override fun onTouchEvent(event: MotionEvent): Boolean {when (event.action) {MotionEvent.ACTION_DOWN -> {scaleX = 0.9f // 按下时缩小scaleY = 0.9f}MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {scaleX = 1f // 抬起时恢复scaleY = 1f}}return super.onTouchEvent(event)}}完全自定义(继承 View,适合复杂需求)
比如画个圆形进度条,需要自己处理测量、绘制和触摸事件。步骤稍复杂,但灵活性最高。
关键方法:
兔子哥提醒:新手别一上来就挑战完全自定义,先从组合控件练起,熟悉后再慢慢进阶,不然很容易劝退。onMeasure():测量控件大小,不然可能显示不出来;onDraw():用 Canvas 画图形、文字,比如画圆弧表示进度;onTouchEvent():处理点击、滑动等交互。
自定义控件最容易踩的坑,避开就成功一半
没重写 onMeasure,控件显示不全
症状:控件在布局里设了 wrap_content,结果还是占满全屏或小得看不见。
解决:重写 onMeasure 计算宽高,比如圆形控件宽高取最小值:
kotlinoverride fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)val width = measuredWidthval height = measuredHeightval size = minOf(width, height) // 宽高取最小,保证是圆形setMeasuredDimension(size, size)}频繁刷新导致卡顿
症状:自定义进度条每秒刷新多次,滑动界面就卡。
解决:用postInvalidateDelayed()控制刷新频率,比如每秒刷新 30 次足够了,别太频繁。
二、性能优化:APP 卡顿闪退?这 5 招让它丝滑流畅
场景问题:为啥我的 APP 滑动起来一顿一顿的?性能差影响大吗?
APP 卡顿不仅影响体验,用户可能直接卸载,尤其是电商、视频类 APP,流畅度太重要了。卡顿大多是因为主线程干了太多重活,比如在 onDraw 里做复杂计算,或者频繁创建对象导致 GC(垃圾回收)频繁,对吧?
实用优化技巧,新手也能学会
减少布局层级,别让界面 “叠罗汉”
布局嵌套太多(比如 LinearLayout 套 LinearLayout),系统绘制时要一层一层算,就会慢。解决:用 ConstraintLayout 替代多层 LinearLayout,一次布局搞定位置关系;
去掉没用的父布局,比如一个 LinearLayout 里只有一个子控件,直接删了。
可以用 Android Studio 的 “Tools→Layout Inspector” 看布局层级,超过 5 层就该优化了。避免过度绘制,别让界面 “穿太多衣服”
过度绘制就是一个像素被画了多次(比如背景重叠),浪费 GPU 资源。症状:打开 “开发者选项→调试 GPU 过度绘制”,界面发红或发紫。
解决:去掉多余背景,比如父布局和子控件都设背景,保留一个就行;
用
android:clipChildren="false"减少不必要的裁剪。图片优化,别让大图拖垮性能
图片太大是性能杀手!比如把 2000x2000 的图直接当头像用,内存占用超高。
解决:根据控件大小加载图片,用 Glide 或 Coil 库自动压缩:
Glide.with(this).load(url).override(200, 200).into(imageView);用 WebP 格式替代 JPG/PNG,体积小一半画质差不多。
别在主线程干重活,让子线程 “帮忙”
主线程负责 UI 更新,要是在里面做网络请求、数据库查询,就会卡顿甚至 ANR(应用无响应)。解决:
kotlin// 用协程在后台执行lifecycleScope.launch(Dispatchers.IO) {val data = db.getUser() // 数据库操作withContext(Dispatchers.Main) {updateUI(data) // 更新UI切回主线程}}网络请求、数据库操作放子线程,用协程或线程池:
避免内存泄漏,别让 APP “越用越卡”
内存泄漏就是没用的对象没被回收,占着内存,时间长了 APP 就卡甚至闪退。常见原因:静态变量持有 Activity 引用;
匿名内部类持有外部类引用(比如 Handler)。
解决:用弱引用(WeakReference)持有 Activity;
Activity 销毁时取消网络请求、移除 Handler 消息。
网友 “安卓开发小李” 分享:“之前 APP 滑动卡顿,用 Layout Inspector 一看,布局嵌套了 8 层!改成 ConstraintLayout 后,层级降到 3 层,滑动立马流畅了,原来布局优化这么重要!”
三、Android 14 适配:升级系统后 APP 崩了?这 4 个变化要注意
基础问题:Android 14 有啥新变化?不适配行不行?
不行哦!现在新手机很多预装 Android 14,用户升级系统后,你的 APP 可能闪退、功能失效。Android 14 主要在权限、行为变更和 UI 上有变化,不适配的话,用户体验会很差,对吧?
必做适配技巧,不然 APP 容易崩
处理运行时权限新变化,别让权限弹框 “吓走用户”
Android 14 对敏感权限管得更严,比如照片权限,不能一次性要所有照片了,得按需申请。
解决:
kotlin// 检查并申请照片权限if (ContextCompat.checkSelfPermission(this, READ_MEDIA_IMAGES) != PackageManager.PERMISSION_GRANTED) {ActivityResultContracts.RequestPermission().launch(READ_MEDIA_IMAGES)}申请照片权限时,用新的
READ_MEDIA_IMAGES权限,并且只能访问用户选中的照片;申请权限前弹个对话框解释用途,比如 “需要访问照片来上传头像”,用户更愿意授权。
代码示例:适配前台服务类型限制,后台服务别 “偷偷跑”
Android 14 要求前台服务必须指定类型(比如type=mediaPlayback),不然启动会失败。
解决:在 AndroidManifest.xml 里声明类型:
xml<serviceandroid:name=".MyForegroundService"android:foregroundServiceType="mediaPlayback" />
启动服务时也要指定:
kotlinval intent = Intent(this, MyForegroundService::class.java)ContextCompat.startForegroundService(this,intent.putExtra(ForegroundService.TYPE, ForegroundService.TYPE_MEDIA_PLAYBACK))
处理 Activity 启动限制,别让跳转 “失灵”
Android 14 限制后台启动 Activity,比如推送点击跳转页面,可能跳不起来。
解决:用PendingIntent.FLAG_IMMUTABLE创建 PendingIntent,或者在前台时再启动 Activity。适配 UI 变化,别让界面 “变形”
Android 14 对状态栏、导航栏样式有微调,比如默认字体大小可能变化。
解决:用
dp和sp做单位,别用固定像素;在不同尺寸模拟器上测试,确保布局自适应。
四、自问自答:实战开发常问的问题
“自定义控件和性能优化哪个更重要?新手该先学哪个?”
都重要,但新手可以先学基础的性能优化,比如布局层级和主线程操作,这些优化后 APP 体验立竿见影;自定义控件可以慢慢来,先能用系统控件实现功能,再追求个性化。
“Android 14 适配一定要升级 targetSdkVersion 吗?”
最好升级到 34(Android 14),不然有些新 API 用不了,而且未来应用商店可能要求必须适配最新系统。升级后仔细测试,有问题按上面的技巧改就行,不用怕。
“性能优化有没有工具推荐?自己测不出来咋办?”
Android Studio 自带工具超好用!“Profiler” 能看内存、CPU 占用,“Lint” 能检测布局问题,“Monitors” 能看帧率。遇到卡顿,先用这些工具定位问题,比瞎猜靠谱多了。
结尾心得
自定义控件让 APP 有个性,性能优化让 APP 流畅,系统适配让 APP 兼容新设备,这三块都是安卓开发的硬骨头,但啃下来成就感超足。兔子哥的经验是,自定义控件别贪多求全,先保证能用再优化样式;性能优化要日常积累,写代码时就注意别在主线程干重活;系统适配别等用户反馈了才做,提前用模拟器测试,把问题扼杀在上线前。其实开发 APP 就像养植物,得耐心打理,有问题及时修,才能长得好。坚持实战,多写多测,你开发的 APP 也能又好看又流畅,加油!
标签: 从零开始 LinearLayout
还木有评论哦,快来抢沙发吧~