仿新版手机QQ底部动态按钮

作者: 大头呆 | 来源:发表于2017-06-17 18:19 被阅读1790次

不知道细心的同学注意到没有,新版手机QQ的底部tab按钮特别有意思,当手放在上面的时候,这个按钮可以随手指的移动而改变形状,如下图:

hdssh.gif

于是我就仿写了一个,其实实现原理也挺简单的,最终的效果图如下:

hdsxxxsh.gif

第一步我们得下载QQ的apk文件,把里面的按钮图片资源解压出来,不过解压之后一看瞬间懵逼了,居然有这么多文件夹,而且还是混淆过后的:

image.png

还好机智的我试着搜索tab、menu、selected等关键词后才其中一个文件夹发现了这些图片:

image.png

原来每个tab按钮都是由1~2张图片拼在一起的,那我就封装成一个控件,然后仿写第一个按钮好了。
实现原理很简单,继承FrameLayout,添加1~2张图片,在onTouchEvent方法中移动。当然为了实现上述效果,两张图片移动的比例(或者阻尼值)是不同的,而且还要限制两张图片的移动范围。

    @Override
    public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();
    int action = event.getAction();
    switch (action) {
        case MotionEvent.ACTION_MOVE: {
            changeWhenMove(x, y);
            return true;
        }
        case MotionEvent.ACTION_UP: {
            restorePosition();
            if (isContain(this, event.getRawX(), event.getRawY())) {
                setHasClick(!hasClick);
                if (OnMenuClickListener != null) {
                    OnMenuClickListener.onItemClick(this);
                }
            }
            return true;
        }
    }
    return true;
}

核心代码如上:ACTION_MOVE时移动控件,ACTION_UP时还原至原位置。如果手指抬起的位置在按钮范围内则响应点击事件。这样就简单实现了QQ动态按钮的效果。实际使用也很简单:简单在布局文件中声明,并在代码中设置普通状态的图片id和按下状态的图片的id就行了:

   <com.renny.qqmenu.QQMenu
    android:id="@+id/avater_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"/>   
   QQMenu.setImgages(R.drawable.skin_tab_icon_conversation_normal
                , R.drawable.skin_tab_icon_conversation_selected
                , R.drawable.rvq, R.drawable.rvr);
   QQMenu.setOnMenuClickListener(new QQMenu.OnMenuClickListener() {
            @Override
            public void onItemClick(View view) {
                Toast.makeText(MainActivity.this, "Click "+QQMenu.isHasClick(), 
Toast.LENGTH_SHORT).show();
            }
        });

最后贴下github地址,欢迎提交Issues,如果你觉得用的着的话还请点个赞哦。

相关文章

  • 仿新版手机QQ底部动态按钮

    不知道细心的同学注意到没有,新版手机QQ的底部tab按钮特别有意思,当手放在上面的时候,这个按钮可以随手指的移动而...

  • 30个值得拥有的sketch插件(2)

    06 动态按钮-DynamicButton3.5新版插件比之前的版本更加成功。单击或者使用画板快捷键,动态按钮自动...

  • 仿QQ音乐常驻底部栏播放按钮效果

    最近完成了一个高仿的QQ音乐播放器,其中我实现了常驻底部栏,里面的播放按钮的实现方式在这里总结回顾一下。 可以看到...

  • 仿QQ音乐底部栏

    最近在开发一款高仿QQ音乐播放器的Demo,遇到了一个问题,在QQ音乐主界面有一个常驻底部栏,底部栏中有一个可左右...

  • 仿qq底部tab导航

    本篇博客主要实现以下效果: 使用FragmentTabHost实现qq底部Tab切换 使用RadioGroup和R...

  • SafeArea widget

    SafeArea widget是适配手机屏幕---刘海屏,底部虚拟按钮等.

  • 微信小程序input、textarea层级穿透问题

    这里遇到的问题,是动态textarea列表,底部提交按钮position:fiexd悬浮。在滑动页面,textar...

  • RadioButton的总结

    前言 单选按钮,在很多地方都可以用到,比如底部导航栏,仿TabLaoyut实现ViewPager切换效果等等。就像...

  • 2018-01-19 Axure 微信制作第九节

    1、点击底部导航的键盘、文本框、表情和加号按钮,对话和底部导航均能以线性的方式向上移动,时间为500ms。通过动态...

  • Mac SSH iPhone

    一、手机安装OpenSSH 打开手机Cydia软件,点击底部搜索按钮,搜索Open SSH,点击安装。 二、SSH...

网友评论

  • 0445981d6022:续1秒,一颗赛艇。
  • 冯走心:楼主 请教下 如果用js的话 如何实现java的这个api? js应该怎么写呢 提供个思路
    冯走心:@大头呆 其实我不应该这么说,但是我确实研究好久没做出来。 兄台如果可以可否给个实例。我看了java代码 是移动内外两张图片的xy坐标吗? css3的话用啥来实现呢? 我用的旋转也不对。
    大头呆:监听touch 事件手指触摸的坐标点位置,实时按不同比例移动内外两张图片
  • 冯走心:有木有js版本的?
  • Cryptic:写的很有深度,嗯
  • hash_070c:哥们, 你那个 changeWhenMove()方法中的判断根据是什么,没有看太懂,望赐教.
    if (y + centerY < -12 * centerY) {
    y = -12 * centerY - centerY;
    大头呆: @hash_070c 这个比例只是在实际移动按钮所能达到的一个较好的效果,不是固定的
  • aa57895b25cf:正想着弄一弄呢,楼主666。

本文标题:仿新版手机QQ底部动态按钮

本文链接:https://www.haomeiwen.com/subject/zhkbqxtx.html