组合控件的基本使用

1、此篇文章不适合大家阅读,只是自己做的摘记

2、组合控件:将系统原生态的控件组合效果,加上动画效果,形成特殊UI效果

3、此次代码主要实现优酷菜单

注意点:

   1、逻辑一定要准确,if   else 一般同时出现,并做好备注,以及条件转化;

   2、系统原生的动画旋转和位置动画并没有真正改变View的位置,所以在旋转过程中,我们必须做进一步处理,旋转时,将内部组件设置不可点击

   3、一步一步慢慢写,并修改bug ,更多的了解Animation ;

界面布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"  android:layout_height="match_parent"  app:layout_behavior="@string/appbar_scrolling_view_behavior"  tools:showIn="@layout/activity_main" tools:context=".MainActivity">
<RelativeLayout  android:layout_width="100dp"  android:layout_height="50dp"  android:id="@+id/level1"  android:background="@drawable/level1"  android:layout_centerHorizontal="true"  android:layout_alignParentBottom="true"  >
    <ImageView  android:id="@+id/iv_home"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:src="@drawable/icon_home"  android:layout_centerInParent="true"/>
</RelativeLayout>
    <RelativeLayout  android:layout_width="173dp"  android:layout_height="85dp"  android:background="@drawable/level2"  android:layout_centerHorizontal="true"  android:layout_alignParentBottom="true"  android:id="@+id/level2"  >
        <ImageView  android:layout_width="38dp"  android:layout_height="wrap_content"  android:src="@drawable/icon_search"  android:layout_marginLeft="5dp"  android:layout_alignParentBottom="true" />
        <ImageView  android:layout_width="38dp"  android:layout_height="wrap_content"  android:src="@drawable/icon_myyouku"  android:layout_marginLeft="5dp"  android:layout_alignParentBottom="true"  android:layout_alignParentRight="true"/>
        <ImageView  android:id="@+id/iv_menu"  android:layout_width="38dp"  android:layout_height="wrap_content"  android:src="@drawable/icon_menu"  android:layout_centerHorizontal="true"/>
    </RelativeLayout>
    <RelativeLayout  android:id="@+id/level3"  android:layout_width="258dp"  android:layout_height="129dp"  android:background="@drawable/level3"  android:layout_centerHorizontal="true"  android:layout_alignParentBottom="true"  >
        <ImageView  android:layout_width="38dp"  android:layout_height="wrap_content"  android:layout_alignParentBottom="true"  android:src="@drawable/channel1"  android:layout_marginLeft="5dp"  />
        <ImageView  android:layout_width="38dp"  android:layout_height="wrap_content"  android:layout_alignParentRight="true"  android:layout_alignParentBottom="true"  android:src="@drawable/channel2"  android:layout_marginLeft="2dp"  />
        <ImageView  android:layout_width="38dp"  android:layout_height="wrap_content"  android:layout_alignParentBottom="true"   android:layout_marginBottom="40dp"  android:src="@drawable/channel3"  android:layout_marginLeft="25dp"  android:id="@+id/imageView2" />
        <ImageView  android:layout_width="38dp"  android:layout_height="wrap_content"  android:layout_alignParentBottom="true"  android:layout_alignParentRight="true"  android:layout_marginBottom="40dp"  android:src="@drawable/channel4"  android:layout_marginRight="20dp"  />
        <ImageView  android:layout_width="38dp"  android:layout_height="wrap_content"  android:layout_alignParentBottom="true"  android:layout_alignParentRight="true"  android:layout_marginBottom="70dp"  android:src="@drawable/channel5"  android:layout_marginRight="60dp"  android:id="@+id/imageView" />
        <ImageView  android:layout_width="38dp"  android:layout_height="wrap_content"  android:src="@drawable/channel6"  android:layout_alignTop="@+id/imageView"  android:layout_toEndOf="@+id/imageView2" />
        <ImageView  android:layout_width="38dp"  android:layout_height="wrap_content"  android:src="@drawable/channel7"  android:layout_centerHorizontal="true"/>
    </RelativeLayout>
</RelativeLayout>
 主代码: 
 

 
 

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    ImageView imageViewHome,imageViewMenu;
    boolean isShow2=true;//是否显示二级菜单  boolean isShow3=true;//是否显示三级菜单  boolean isShowMenu=true;//显示主菜单变化,包括一级二级三级菜单,如果有一样在,全显示,如果都不在,则都显示  RelativeLayout level2,level1,level3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //执行控制键初始化,和界面初始化操作  initView();
        //如果,界面较多组件,执行监听操作,更为方便  initListner();
    }
    public void initView(){
        setContentView(R.layout.activity_main);
        imageViewHome= (ImageView) findViewById(R.id.iv_home);
        imageViewMenu= (ImageView) findViewById(R.id.iv_menu);
        level2= (RelativeLayout) findViewById(R.id.level2);
        level1= (RelativeLayout) findViewById(R.id.level1);
        level3= (RelativeLayout) findViewById(R.id.level3);
    }
    public void initListner() {
        imageViewHome.setOnClickListener(this);
        imageViewMenu.setOnClickListener(this);
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if(keyCode==KeyEvent.KEYCODE_MENU){
            //编程的时候一定要注意逻辑,一个判断值,代表一种状态,一旦状态改变,则判断值必须改变  //编码养成习惯,一开一闭,同时将状态值设为改变,以便怕忘记,还有逻辑结构  if(AnimationUtil.animationCount!=0){
                //如果动画在执行的半途中,则不执行  return true;
            }else{

                if (isShowMenu){
                    //只要有在前台界面的组件全部隐藏  if (isShow3){
                        AnimationUtil.closeMenu(level3,530);
                        isShow3=false;
                    }
                    if (isShow2){
                        AnimationUtil.closeMenu(level2,500);
                        isShow2=false;
                    }
                    AnimationUtil.closeMenu(level1,480);
                }else{
                    //反之,全部显示  AnimationUtil.openMenu(level3,530);
                    isShow2=true;
                    isShow3=true;
                    AnimationUtil.openMenu(level2,500);
                    AnimationUtil.openMenu(level1,480);
                }
                isShowMenu=!isShowMenu;
                //返回后,也就是说Menu键,点击被改变  return true;
            }
            }
        return super.onKeyDown(keyCode,event);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.iv_home:
                if(AnimationUtil.animationCount!=0){
                    //说明还有动画未执行完,不执行  return;
                }
                if(isShow2){
                    if(isShow3){
                        AnimationUtil.closeMenu(level3,530);
                        isShow3=false;
                    }
                    //消失二级菜单 ,Log.e("tag","11");  AnimationUtil.closeMenu(level2,500);
                }else{
                    //显示二级菜单// Log.e("tag","12");  AnimationUtil.openMenu(level2,500);
                }
                isShow2=!isShow2;
                break;
            case R.id.iv_menu:
                if(AnimationUtil.animationCount!=0){
                    //说明还有动画未执行完  return;
                }
                if(isShow3){
                    //关闭三级菜单栏  AnimationUtil.closeMenu(level3,500);
                }else{
                    //显示三级菜单栏  AnimationUtil.openMenu(level3,500);
                }
                isShow3=!isShow3;
                break;
            default:
                break;
        }
    }
}

动画隐藏和出现代码:

public class AnimationUtil {
    public static int animationCount=0;  //记录一个动画是否完成  public static void closeMenu(RelativeLayout relativeLayout,int duration){
        //移动菜单时,执行子控件无法点击(常识)  for (int i=0;i<relativeLayout.getChildCount();i++){
            relativeLayout.getChildAt(i).setEnabled(false);
        }
        //创建旋转动画对象,相对自身的中心点旋转  RotateAnimation rotateAnimation=new RotateAnimation(0,-180, RELATIVE_TO_SELF,0.5f, RELATIVE_TO_SELF,1);
        //设置延迟时间,更好的展示旋转效果  rotateAnimation.setDuration(duration);
        relativeLayout.startAnimation(rotateAnimation);
        //动画结束后,保持结束的状态  rotateAnimation.setFillAfter(true);
        //创建动画监听器,此代码旨在记录动画是否完成  rotateAnimation.setAnimationListener(new MyAnimationListener());
    }

    public static void openMenu(RelativeLayout relativeLayout,int duration){
        //保证在控件重新显示出来的时候,又可以被点击(常识)  for (int i=0;i<relativeLayout.getChildCount();i++){
            relativeLayout.getChildAt(i).setEnabled(true);
        }
        RotateAnimation rotateAnimation=new RotateAnimation(-180,0, RELATIVE_TO_SELF,0.5f, RELATIVE_TO_SELF,1);
        rotateAnimation.setDuration(duration);
        relativeLayout.startAnimation(rotateAnimation);
        rotateAnimation.setAnimationListener(new MyAnimationListener());
        //动画结束后,保持当时的状态  rotateAnimation.setFillAfter(true);
    }
    static class MyAnimationListener implements Animation.AnimationListener{
        @Override
        public void onAnimationStart(Animation animation) {
            animationCount++;
        }
        @Override
        public void onAnimationEnd(Animation animation) {
            animationCount--;
        }
        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    }
}

你可能感兴趣的:(组合控件的基本使用)