面试题答案
一键面试-
实现思路:
- 布局:使用
CardView
作为卡片式布局的容器,它是Material Design组件中专门用于实现卡片效果的视图。在布局文件中定义CardView
,设置其属性如背景、圆角、阴影等以满足设计需求。 - 动画:
- 使用的动画类:使用
ObjectAnimator
来实现淡入淡出效果。淡入时,通过ObjectAnimator.ofFloat(cardView, "alpha", 0f, 1f)
设置透明度从0到1;淡出时,通过ObjectAnimator.ofFloat(cardView, "alpha", 1f, 0f)
设置透明度从1到0 。
- 使用的动画类:使用
- 管理动画状态:
- 定义一个变量(如
isAnimating
)来标记当前卡片是否正在执行动画。当动画开始时,将isAnimating
设为true
,动画结束时设为false
。 - 在点击事件处理中,首先检查
isAnimating
,如果为true
则不执行新的动画,避免动画重叠。
- 定义一个变量(如
- 优化动画性能:
- 复用动画实例:避免每次点击都创建新的
ObjectAnimator
实例。可以在类成员中定义ObjectAnimator
对象,在需要时重置其属性并启动。 - 设置合适的动画时长:避免设置过长或过短的动画时长。过短可能导致动画卡顿,过长则影响用户体验。例如,淡入淡出动画时长设置为300 - 500毫秒比较合适。
- 硬件加速:确保
CardView
所在的视图层级开启了硬件加速。在AndroidManifest.xml文件中,为对应的Activity设置android:hardwareAccelerated="true"
,这可以利用GPU来加速动画渲染,提升性能。
- 复用动画实例:避免每次点击都创建新的
- 布局:使用
-
示例代码(Kotlin):
import android.animation.ObjectAnimator
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.cardview.widget.CardView
class MainActivity : AppCompatActivity() {
private lateinit var cardView: CardView
private var isAnimating = false
private lateinit var fadeInAnimator: ObjectAnimator
private lateinit var fadeOutAnimator: ObjectAnimator
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
cardView = findViewById(R.id.card_view)
fadeInAnimator = ObjectAnimator.ofFloat(cardView, "alpha", 0f, 1f).apply {
duration = 300
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator) {
isAnimating = true
}
override fun onAnimationEnd(animation: Animator) {
isAnimating = false
}
})
}
fadeOutAnimator = ObjectAnimator.ofFloat(cardView, "alpha", 1f, 0f).apply {
duration = 300
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator) {
isAnimating = true
}
override fun onAnimationEnd(animation: Animator) {
isAnimating = false
}
})
}
cardView.setOnClickListener {
if (!isAnimating) {
if (cardView.alpha == 1f) {
fadeOutAnimator.start()
} else {
fadeInAnimator.start()
}
}
}
}
}
- 布局文件(activity_main.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<androidx.cardview.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="8dp"
app:cardElevation="4dp"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Card Content" />
</androidx.cardview.widget.CardView>
</LinearLayout>