用法:在图片上实现动画效果
<FrameLayoutandroid:id="@+id/image_container"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/ivBlank"android:layout_width="match_parent"android:layout_height="260dp"android:scaleType="centerCrop"android:src="@drawable/wm_after_meeting_blank" /><com.xx.view.SkeletonViewandroid:id="@+id/skeleton_view"android:layout_width="match_parent"android:layout_height="260dp" /></FrameLayout>
实现:
import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.View/*** Author: xx* Description:骨架图效果* Date: 2023/9/25 15:14*/
class SkeletonView : View {private val edgeColor = Color.parseColor("#00FFFFFF")private val centerColor = Color.parseColor("#20FFFFFF")private val mColors = intArrayOf(edgeColor, centerColor, edgeColor)private val mPaint = Paint()private val mLinearGradient: LinearGradientprivate var mViewWidth = 0private var mViewHeight = 0private var mTranslate = 0fprivate val shimerWidth = 160constructor(context: Context) : super(context)constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)init {mLinearGradient = LinearGradient(0f,0f,shimerWidth.toFloat(),shimerWidth.toFloat(),mColors,floatArrayOf(0f, 0.5f, 1.0f),Shader.TileMode.CLAMP)mPaint.shader = mLinearGradient}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)mViewWidth = measuredWidthmViewHeight = measuredHeightif (mViewWidth > 0 && mViewHeight > 0) {mTranslate += mViewWidth / 10if (mTranslate > mViewWidth + shimerWidth) {mTranslate = -shimerWidth.toFloat()}}mLinearGradient.setLocalMatrix(Matrix().apply {setTranslate(mTranslate, mTranslate)})canvas.drawRect(0f, 0f, mViewWidth.toFloat(), mViewHeight.toFloat(), mPaint)postInvalidateDelayed(100)}
}
颜色宽度速度都可以调,不需要引入三方sdk