优酷菜单

  • 常用控件回顾
  • 布局文件实现
  • 代码处理逻辑
  • 解决bug的两种方法(ViewGroup和属性动画)

常用控件回顾

  1. 按钮控件(ButtonImageButton)
    ImageButton继承自ImageView,只显示图片;Button继承自TextView,用于显示文字。
  2. 进度条Progressbar
    继承自View,显示正在运行的状态。有两种显示形式:环形和水平。通过style属性来改变样式。
  3. 单选按钮(RadioButton)和复选按钮(CheckBox)
    都继承自CompoundButton,都只有选中和未选中两种状态,可以通过checked属性来设置。不同的是,在一个RadioGroup中只能有一个RadioButton处于选中状态,CheckBox则可以有多个按钮被选中。
  4. 状态开关按钮(ToggleButton)
    继承自CompoundButton,状态只能是选中和未选中,并且需要为不同的状态设置不同的显示文本。
  5. 时钟控件(AnalogClock)和(DigitalClock)
    AnalogClock继承自View,用于显示模拟时钟,只显示时针和分针;DigitalClock继承自TextView,用于显示数字时钟可精确到秒。

布局文件实现

  1. 效果展示

Android自定义View实现优酷菜单效果展示

2. activity_youkumenu.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:id="@+id/three"android:layout_centerHorizontal="true"android:layout_alignParentBottom="true"android:layout_width="320dp"android:layout_height="160dp"android:background="@drawable/three"><ImageViewandroid:id="@+id/img1"android:layout_width="30dp"android:layout_height="30dp"android:src="@drawable/jiehuan"android:tint="#ffffff"android:layout_alignParentBottom="true"android:layout_marginLeft="15dp"android:layout_marginBottom="5dp"/><ImageViewandroid:id="@+id/img2"android:layout_width="30dp"android:layout_height="30dp"android:src="@drawable/cheliangdangan"android:tint="#ffffff"android:layout_above="@id/img1"android:layout_marginBottom="20dp"android:layout_marginLeft="40dp"/><ImageViewandroid:id="@+id/img3"android:layout_width="30dp"android:layout_height="30dp"android:src="@drawable/cheliangliebiao"android:tint="#ffffff"android:layout_above="@id/img2"android:layout_marginBottom="20dp"android:layout_marginLeft="80dp"/><ImageViewandroid:id="@+id/img4"android:layout_width="30dp"android:layout_height="30dp"android:src="@drawable/cheliangxinxi"android:tint="#ffffff"android:layout_centerHorizontal="true"android:layout_marginTop="10dp"/><ImageViewandroid:id="@+id/img7"android:layout_width="30dp"android:layout_height="30dp"android:src="@drawable/cheliangyiban"android:tint="#ffffff"android:layout_alignParentRight="true"android:layout_alignParentBottom="true"android:layout_marginRight="10dp"android:layout_marginBottom="5dp"/><ImageViewandroid:id="@+id/img6"android:layout_width="30dp"android:layout_height="30dp"android:src="@drawable/weixiu"android:tint="#ffffff"android:layout_above="@id/img7"android:layout_marginBottom="20dp"android:layout_marginRight="30dp"android:layout_alignParentRight="true"/><ImageViewandroid:id="@+id/img5"android:layout_width="30dp"android:layout_height="30dp"android:src="@drawable/zuche"android:tint="#ffffff"android:layout_above="@id/img6"android:layout_marginBottom="20dp"android:layout_marginRight="80dp"android:layout_alignParentRight="true" /></RelativeLayout><RelativeLayoutandroid:id="@+id/two"android:layout_centerHorizontal="true"android:layout_alignParentBottom="true"android:layout_width="220dp"android:layout_height="110dp"android:background="@drawable/two"><ImageViewandroid:src="@drawable/baoyang"android:layout_width="30dp"android:layout_height="30dp"android:layout_alignParentBottom="true"android:layout_marginBottom="5dp"android:layout_marginLeft="15dp"/><ImageViewandroid:id="@+id/menu"android:src="@drawable/chakan"android:layout_width="30dp"android:layout_height="30dp"android:layout_centerHorizontal="true"android:layout_marginTop="10dp"/><ImageViewandroid:src="@drawable/cheliang"android:layout_width="30dp"android:layout_height="30dp"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:layout_marginRight="15dp"android:layout_marginBottom="5dp"android:layout_marginTop="20dp"/></RelativeLayout><RelativeLayoutandroid:id="@+id/one"android:layout_centerHorizontal="true"android:layout_alignParentBottom="true"android:layout_width="120dp"android:layout_height="60dp"android:background="@drawable/one"><ImageViewandroid:id="@+id/home"android:src="@drawable/xinzeng"android:layout_width="30dp"android:layout_height="30dp"android:layout_centerHorizontal="true"android:layout_marginTop="25dp"/></RelativeLayout></RelativeLayout>
  1. 效果图展示

代码处理逻辑

1.YouKuMenu.java

package com.swpuiot.test;import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class YouKuMenu extends AppCompatActivity {private ImageView home,menu;private RelativeLayout one,two,three;//是否显示第三个圆环private boolean isShow3 = true;//是否显示第二个圆环private boolean isShow2 = true;//是否显示第一个圆环private boolean isShow1 = true;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_youkumenu);initView();//设置点击事件MyOnclickListener myOnclickListener = new MyOnclickListener();home.setOnClickListener(myOnclickListener);menu.setOnClickListener(myOnclickListener);}class MyOnclickListener implements View.OnClickListener{@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.home://如果三级菜单和二级菜单是显示的,都设置隐藏if(isShow2){//隐藏二级菜单isShow2 = false;Tools.hideView(two,0);if(isShow3){//隐藏三级菜单isShow3 = false;Tools.hideView(three, 200);}}else {//如果都是隐藏,显示二级菜单isShow2 = true;Tools.showView(two,0);}break;case R.id.menu:if(isShow3){//隐藏isShow3 = false;Tools.hideView(three,0);}else{//显示isShow3 = true;Tools.showView(three,0);}break;}}}private void initView() {home = findViewById(R.id.home);menu = findViewById(R.id.menu);one = findViewById(R.id.one);two = findViewById(R.id.two);three = findViewById(R.id.three);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if(keyCode == KeyEvent.KEYCODE_MENU){//如果一级,二级,三级菜单是显示的,就全部隐藏if(isShow1){isShow1 = false;Tools.hideView(one,0);if(isShow2){//隐藏二级菜单isShow2 = false;Tools.hideView(two,200);if(isShow3){//隐藏三级菜单isShow3 = false;Tools.hideView(three,400);}}}else{//如果一级,二级菜单隐藏,就显示//显示一级菜单isShow1 = true;Tools.showView(one,0);//显示二级菜单isShow2 = true;Tools.showView(two,200);}}return super.onKeyDown(keyCode, event);}
}
  1. Tools.java
package com.swpuiot.test;import android.animation.ObjectAnimator;
import android.view.View;
import android.view.animation.RotateAnimation;/*** 显示和隐藏指定控件*/class Tools {public static void hideView(View view, long startOffset) {//方法一:视图动画RotateAnimation ra = new RotateAnimation(0, 180, view.getWidth()/2, view.getHeight());//设置动画播放持续的时间ra.setDuration(500);//动画停留在播放完成的状态ra.setFillAfter(true);//延迟多久后播放动画ra.setStartOffset(startOffset);view.startAnimation(ra);}public static void showView(View view, long startOffset) {//方法一:视图动画RotateAnimation ra = new RotateAnimation(180, 360, view.getWidth()/2, view.getHeight());//设置动画播放持续的时间ra.setDuration(500);//动画停留在播放完成的状态ra.setFillAfter(true);ra.setStartOffset(startOffset);view.startAnimation(ra);}}
}

解决bug的两种方法(ViewGroup和属性动画)

使用上面的Tools.java文件,我们会发现当点击物理按键menu时,一级、二级、三级菜单旋转180°隐藏之后点击隐藏掉的控件位置时仍然可以对控件进行操作,这是bug。

  1. 方法一:视图动画。使用ViewGroup,因为ViewGoup能够对子控件进行操作,而View则不能实现对子控件的操作。修改代码如下:
package com.swpuiot.test;import android.animation.ObjectAnimator;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.RotateAnimation;/*** 显示和隐藏指定控件*/class Tools {public static void hideView(ViewGroup view, long startOffset) {//方法一:视图动画RotateAnimation ra = new RotateAnimation(0, 180, view.getWidth()/2, view.getHeight());//设置动画播放持续的时间ra.setDuration(500);//动画停留在播放完成的状态ra.setFillAfter(true);//延迟多久后播放动画ra.setStartOffset(startOffset);view.startAnimation(ra);//设置不可点击for (int i = 0; i < view.getChildCount(); i++) {View children = view.getChildAt(i);children.setEnabled(false);}}public static void showView(ViewGroup view, long startOffset) {//方法一:视图动画RotateAnimation ra = new RotateAnimation(180, 360, view.getWidth()/2, view.getHeight());//设置动画播放持续的时间ra.setDuration(500);//动画停留在播放完成的状态ra.setFillAfter(true);ra.setStartOffset(startOffset);view.startAnimation(ra);//设置可点击for (int i = 0; i < view.getChildCount(); i++) {View children = view.getChildAt(i);children.setEnabled(true);}}
}
  1. 使用属性动画:
package com.swpuiot.test;import android.animation.ObjectAnimator;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.RotateAnimation;/*** 显示和隐藏指定控件*/class Tools {public static void hideView(ViewGroup view, long startOffset) {//方法二:视图动画 --> 属性动画ObjectAnimator animator = new ObjectAnimator();animator.ofFloat(view,"rotation",0,180);animator.setDuration(500);animator.setStartDelay(startOffset);animator.start();view.setPivotX(view.getWidth()/2);view.setPivotY(view.getHeight());}public static void showView(ViewGroup view, long startOffset) {//方法二:视图动画 --> 属性动画ObjectAnimator animator = new ObjectAnimator();animator.ofFloat(view,"rotation",180,360);animator.setDuration(500);animator.setStartDelay(startOffset);animator.start();view.setPivotX(view.getWidth()/2);view.setPivotY(view.getHeight());}
}

说在最后面,在案例中所用到的图片均是在网上随意找的图片,所以大家可以自行准备一些图标进行试验。

Android自定义控件:优酷菜单相关推荐

  1. android仿优酷菜单,Android自定义控件之仿优酷菜单

    去年的优酷HD版有过这样一种菜单,如下图: 应用打开之后,先是三个弧形的三级菜单,点击实体键menu之后,这三个菜单依次旋转退出,再点击实体键menu之后,一级菜单会旋转进入,点击一级菜单,二级菜单旋 ...

  2. android的优酷菜单,Android利用属性动画实现优酷菜单

    利用属性动画实现优酷菜单,供大家参考,具体内容如下 布局文件 xmlns:tools="http://schemas.android.com/tools" android:layo ...

  3. android仿优酷菜单,Android编程实现仿优酷旋转菜单效果(附demo源码)

    本文实例讲述了Android编程实现仿优酷旋转菜单效果.分享给大家供大家参考,具体如下: 首先,看下效果: 不好意思,不会制作动态图片,只好上传静态的了,如果谁会,请教教我吧. 首先,看下xml文件: ...

  4. my android tools优酷,Android自定义控件——仿优酷圆盘菜单

    最近学习的时候,看见一份资料上教怎么写自定义控件,上面的示例用的是优酷早期版本的客户端,该客户端的菜单就是一个自定义的组件(现在的版本就不清楚有没有了,没下载过了),好吧,废话不多说,先上优酷的原型图 ...

  5. android自定义控件之模仿优酷菜单

    去年的优酷HD版有过这样一种菜单,如下图: 应用打开之后,先是三个弧形的三级菜单,点击实体键menu之后,这三个菜单依次旋转退出,再点击实体键menu之后,一级菜单会旋转进入,点击一级菜单,二级菜单旋 ...

  6. Android版优酷网闪亮登场

    日前,中国最大口碑最好的在线视频提供商优酷专门为Android操作系统开通了Android版优酷网页,直接在浏览器中输入and.youku.com即可登录.使用Android设备的广大机友们甚至不需要 ...

  7. Android仿优酷视频的悬浮窗播放

    Android仿优酷视频的悬浮窗播放 之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能 ...

  8. android浮窗播放器,Android仿优酷视频的悬浮窗播放效果

    之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能在悬浮窗中新建视频控件,所以需要在悬浮 ...

  9. Android优酷菜单组件自定义

    主要做的就是模仿优酷手机客户端的底部菜单控件的实现.先来几张图片,点击中间的home,显示二级菜单,点击二级菜单的menu,显示三级菜单. 这是实现起来最简单的一个布局,但是从中学会了自定义动画和一些 ...

最新文章

  1. python format 格式化字符串
  2. 【廖雪峰python入门笔记】布尔运算和短路计算
  3. 工作中涉及运维知识点的汇总
  4. [JBoss] - 环境搭建
  5. 笔记-高项案例题-2018年上-质量管理
  6. ASP.NET服务器控件数据绑定总结
  7. 在Kotlin中 使用js 函数
  8. c++ sort 从大到小排序_算法的艺术:MySQL order by对各种排序算法的巧用
  9. 原来国家的名字可以如此的浪漫~~!
  10. HTML5摩托车配件销售商城模板
  11. ADF12C 一个应用读多个数据库的数据
  12. FITS文件标准 3:FITS文件的架构
  13. 华硕主板H81M-E BIOS刷NVMe支持M.2固态硬盘成功
  14. 算数运算,逻辑运算,算术右移,逻辑右移
  15. 【规划】Motion Planning Approaches 路径规划方法汇总
  16. 利用Python进行随机取名
  17. 微型计算机 外储存器,微型计算机的外辅储存器是指什么
  18. 使用iterm2查看日志时屏幕持续滚动将老内容冲掉的设置
  19. others:南怀瑾先生讲:呵呼嘘吹嘻呬六字诀养生诀的要领---《南怀瑾与彼得圣吉》
  20. Koomail是什么

热门文章

  1. 「PCB设计」刚挠结合设计中的替代结构
  2. 【sed】sed命令详解+示例
  3. 媳妇居然在家偷偷背着我偷看我的面试笔记,一个月后拿下大厂offer!
  4. 2021-12-16 vue移动端卖座电影项目(十三) 使用vuex的getter筛选comingSoon的显示电影数
  5. 毕业设计So Easy:在线考试答题系统
  6. 上交大计算机推免生源学校,2018年上海交通大学各专业推免生人数统计、研究生名单...
  7. 引领邮件技术,沟通创造价值
  8. selectionSort
  9. 猎户座计划软件测试,麒麟820信心爆棚?评测结果:秒杀骁龙865和猎户座980
  10. 0404有理函数的积分-不定积分