android 三步代码创建呼吸灯效果
如图:这里介绍的是怎么完全用代码创建一个这样的效果;
–bug及解决方式:类似于在不同选项卡的界面之间来回切换时,缩放动画的相对位置发生错乱(本来).解决办法是切换出去时把包裹两个同心圆的FrameLayout从当前页面给remove调,切换进来时在重新初始化并添加一次;
// 1.创建两个ImageView,设置圆形背景
mIv_inner = new ImageView(mContext);
mIv_outer = new ImageView(mContext);
GradientDrawable drawable_outer = new GradientDrawable(); //共用一个Drawable背景会有bug,这里new俩
drawable_outer.setShape(GradientDrawable.OVAL);
drawable_outer.setColor(...);
GradientDrawable drawable_inner = new GradientDrawable();
drawable_inner.setShape(GradientDrawable.OVAL);
drawable_inner.setColor(getResources().getColor(...);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
mIv_inner.setBackgroundDrawable(drawable_inner);
mIv_outer.setBackgroundDrawable(drawable_outer);
} else {
mIv_inner.setBackground(drawable_inner);
mIv_outer.setBackground(drawable_outer);
}
// 2.ImageView添加到FrameLayout
mParams_inner = new LayoutParams(16, 16);
mParams_outer = new LayoutParams(28,28);
mParams_inner.gravity = Gravity.CENTER;
mParams_outer.gravity = Gravity.CENTER;
mFramelayout = new FrameLayout(mContext);
mFramelayout.addView(mIv_inner, mParams_inner);
mFramelayout.addView(mIv_outer, mParams_outer);
// 3.设置动画
ScaleAnimation anim_scale = new ScaleAnimation(16 / 28 , 1f, 16 / 28, 1f,
//外圆从和内圆等大的位置开始缩放,这样好处是他俩的包裹父布局的大小能确定为外圆的大小
ScaleAnimation.RELATIVE_TO_SELF,0.5f,ScaleAnimation.RELATIVE_TO_SELF,0.5f);
AlphaAnimation anim_alpha = new AlphaAnimation(1.0f, 0.3f);
anim_scale.setRepeatCount(AnimationSet.INFINITE);
anim_alpha.setRepeatCount(AnimationSet.INFINITE);
mAnimationSet = new AnimationSet(true);
mAnimationSet.addAnimation(anim_scale);
mAnimationSet.addAnimation(anim_alpha);
mAnimationSet.setInterpolator(new DecelerateInterpolator());
mAnimationSet.setFillAfter(false);
mAnimationSet.setDuration(1555);
mLayout.addView(mFramelayout,new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)); //加到当前布局
mIv_outer.startAnimation(mAnimationSet);