目的
实现点击一个控件按照一定规律弹出其他控件

相关技术、及其使用
1、以RelativeLayout为父容器,分别添加ImageButton,把所需要操作的控件添加到界面上,并添加对应的id
<ImageButton
android:id="@+id/ib_e"
style="@style/ManuBtnStyle"
android:src="@drawable/e"/>
<ImageButton
android:id="@+id/ib_d"
style="@style/ManuBtnStyle"
android:src="@drawable/d"/>
<ImageButton
android:id="@+id/ib_c"
style="@style/ManuBtnStyle"
android:src="@drawable/c"/>
<ImageButton
android:id="@+id/ib_b"
style="@style/ManuBtnStyle"
android:src="@drawable/b"/>
<ImageButton
android:id="@+id/ib_a"
style="@style/ManuBtnStyle"
android:src="@drawable/a"/>
2、定义initView()方法,判断当前取出的按钮状态(关闭或者开启)
private void initView() {
ImageButton menu = findViewById(R.id.ib_a);
menu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//遍历数组 取出每一个按钮
for(int i = 0 ;i < resId.length; i++){
//判断当前所处的状态 打开还是关闭
if(isOpen == true){
//之前是打开,现在需要关闭
close(i);
}else {
//之前是关闭的,现在需要打开
open(i);
}
}
isOpen = !isOpen;
}
});
}
3、写一个animate方法来实现动画效果
平分之后两者之间的角度:
//计算平分之后的两个之间的角度
double angle = (float) (Math.PI) / (resId.length + 1);
ImageButton ib = findViewById(resId[i]);
通过id获取对应的控件然后计算当前控件所处的位置
//获取id对应控件
//计算当前控件对应的角度
double mangle = (i + 1) * angle;
//计算x距离
float x = (float) (Math.cos(mangle) * 400);
//计算y距离
float y = (float) (Math.sin(mangle) * 400);
通过创建一个AnimationSet集合来包裹移动和旋转动画,然后开启动画
//移动的动画
TranslateAnimation tAnim = new TranslateAnimation(startx,tox,starty,toy);
tAnim.setDuration(500);
tAnim.setInterpolator(interpolator);
//旋转动画
RotateAnimation rAnim = new RotateAnimation(0, 360 * 3,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF
, 0.5f);
rAnim.setDuration(500);
//创建一个AnimationSet集合 包裹多个动画
AnimationSet set = new AnimationSet(false);
set.setFillAfter(true);
set.addAnimation(rAnim);
set.addAnimation(tAnim);
//开始动画
ib.startAnimation(set);
PS
这个小demo中,学到了当一个控件的多个属性相同时,可以直接创建一个style,方法来管理这些属性,或者实现相应的功能,进一步的控件动画的熟悉和掌握,其中新学到了AnimationSet方法来包裹一个控件的多个动画。
网友评论