博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义View(一)-ViewGroup实现优酷菜单
阅读量:4692 次
发布时间:2019-06-09

本文共 5993 字,大约阅读时间需要 19 分钟。

自定义View的第一个学习案例

  ViewGroup是自动以View中比较常用也比较简单的一种方式,通过组合现有的UI控件,绘制出一个全新的View

效果如下:

 

主类实现如下:

package com.demo.youku;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.Toolbar;import android.view.KeyEvent;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    /**     * False: hide     * 是否显示圆环 默认显示     * true:显示     * false:隐藏     */    private Boolean showLevel1 = true;    private Boolean showLevel2 = true;    private Boolean showLevel3 = true;    private ImageView iconHome;    private ImageView iconMenu;    private RelativeLayout level1;//第一层    private RelativeLayout level2;//第二层    private RelativeLayout level3;//第三层    private Toolbar toolbar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        toolbar = (Toolbar) findViewById(R.id.toolbar);        toolbar.setTitle("优酷菜单");        //设置导航图标要在setSupportActionBar方法之后        setSupportActionBar(toolbar);        toolbar.setNavigationIcon(R.mipmap.icon_menu);        iconHome = (ImageView) findViewById(R.id.home);        iconMenu = (ImageView) findViewById(R.id.icon_menu);        level1 = (RelativeLayout) findViewById(R.id.level1);        level2 = (RelativeLayout) findViewById(R.id.level2);        level3 = (RelativeLayout) findViewById(R.id.level3);        MyOnclickListener myOnclickListener = new MyOnclickListener();        iconHome.setOnClickListener(myOnclickListener);        iconMenu.setOnClickListener(myOnclickListener);        toolbar.setNavigationOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //如果一级二级三级菜单显示 则关闭                if (showLevel1 || showLevel2 || showLevel3) {                    showLevel1 = false;                    showLevel2 = false;                    if (showLevel3) {                        showLevel3 = false;                        Tools.hideView(level3);                        Tools.hideView(level2, 400);                        Tools.hideView(level1, 800);                    } else {                        Tools.hideView(level2);                        Tools.hideView(level1, 300);                    }                } else {                    //如果都未显示 则显示一级二级菜单                    showLevel1 = true;                    showLevel2 = true;                    Tools.showView(level1);                    Tools.showView(level2);                }            }        });    }    class MyOnclickListener implements View.OnClickListener {        @Override        public void onClick(View view) {            //            switch (view.getId()) {                case R.id.home:                    if (showLevel2) {                        showLevel2 = false;                        Tools.hideView(level2);                        if (showLevel3) {                            showLevel3 = false;                            Tools.hideView(level3, 400);                        }                    } else {                        showLevel2 = true;                        Tools.showView(level2);                    }                    break;                case R.id.icon_menu:                    if (showLevel3) {                        showLevel3 = false;                        Tools.hideView(level3);                    } else {                        showLevel3 = true;                        Tools.showView(level3);                    }                    break;            }        }    }}

 

Tools类主要用于控制View的显示和隐藏动画,提供了属性动画,不补间动画两种实现方式

package com.demo.youku;import android.animation.ObjectAnimator;import android.view.View;import android.view.ViewGroup;import android.view.animation.RotateAnimation;import android.widget.RelativeLayout;public class Tools {    /**     * 顺时针旋转0-180度隐藏view     *     * @param view     */    public static void hideView(ViewGroup view) {        hideView(view, 0);    }    /**     * 顺时针旋转180-360度显示view     *     * @param view     */    public static void showView(ViewGroup view) {/*        RotateAnimation ra = new RotateAnimation(180, 360, view.getWidth() / 2, view.getHeight());        ra.setDuration(500);        ra.setFillAfter(true);        view.startAnimation(ra);        //启动ViewGroup中所有子元素的点击事件        for (int i = 0; i < view.getChildCount(); i++) {            View childView = view.getChildAt(i);            childView.setEnabled(true);        }*/        ObjectAnimator animator = ObjectAnimator.ofFloat(view, "Rotation", 180, 360);        animator.setDuration(500);        animator.start();        view.setPivotX(view.getWidth() / 2);        view.setPivotX(view.getHeight());    }    /**     * 延迟旋转     *     * @param view       需要旋转的view     * @param setTimeOut 动画延迟时间     */    public static void hideView(ViewGroup view, int setTimeOut) {        /*RotateAnimation ra = new RotateAnimation(0, 180, view.getWidth() / 2, view.getHeight());        ra.setDuration(500);//动画时间        ra.setFillAfter(true);//是否保留动画结束状态        ra.setStartOffset(setTimeOut);//设置延迟时间        view.startAnimation(ra);        //禁用ViewGroup中错有元素的点击事件        for (int i = 0; i < view.getChildCount(); i++) {            View childView = view.getChildAt(i);            childView.setEnabled(false);        }*/
 

 

animator.setStartDelay(setTimeOut);        animator.start();        view.setPivotX(view.getWidth() / 2);        view.setPivotY(view.getHeight());    }}

 

页面布局如下,布局中使用Toolbar代替ActionBar:主要需要更换默认主题:Theme.AppCompat.Light.NoActionBar

 

转载于:https://www.cnblogs.com/chenyangqi/p/5777422.html

你可能感兴趣的文章
Pycharm配置autopep8让Python代码更符合pep8规范
查看>>
我的第一篇博客
查看>>
【C++算法与数据结构学习笔记------单链表实现多项式】
查看>>
C#垃圾回收机制
查看>>
31、任务三十一——表单联动
查看>>
python之hasattr、getattr和setattr函数
查看>>
maven使用阿里镜像配置文件
查看>>
Copy code from eclipse to word, save syntax.
查看>>
arguments.callee的作用及替换方案
查看>>
23 Java学习之RandomAccessFile
查看>>
P2709 小B的询问
查看>>
PHP echo 和 print 语句
查看>>
第一讲 一个简单的Qt程序分析
查看>>
Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
查看>>
poj 1979 Red and Black(dfs)
查看>>
【.Net基础03】HttpWebRequest模拟浏览器登陆
查看>>
zTree async 动态参数处理
查看>>
Oracle学习之常见错误整理
查看>>
lock_sga引起的ksvcreate :process(m000) creation failed
查看>>
数据库插入数据乱码问题
查看>>