android 自定义属性动画应用之MenuButton

之前做App 有需要一个按钮需要有动画,点击展开变成X ,再次点击变回三根线,好像这东西在html中很好实现,于是我也在android里也做了一次小的应用,直接

<h3>效果图
menubtn.gif

那么怎么实现呢?</h3>

思路:
① 首先要绘制三根线
②观察发现,上下两根线只需要坐标互换下,也就是线的一端位置发生了变化,中间线由完全不透明变成透明
③那么这种数值变化并且还需要动画的,我们自然而然的想到了<h3>属性动画</h3>

④那么OK,我们只需要声明个属性radio,根据这个数值变化做属性变化绘制就OK了
晕-----写完了怎么只保存到这---补全中------------
<h3>先上调用Activity了</h3>

/**
 * Created by LiuDong on 2016/12/30.
 * Email:15002102128@126.com
 */

public class MenuButtonActivity extends Activity {
    private LD_MenuButton menuRed; //红色
    private LD_MenuButton menuWhte;//白色
    private LD_MenuButton menuBig;//大
    private LD_MenuButton menuHuge;//更大 宽高不同

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menubutton);
        initView();
    }

    /**
     * 初始化View
     */
    private void initView() {
        menuRed = (LD_MenuButton) findViewById(R.id.menu_red);
        menuRed.setColor(getResources().getColor(R.color.ld_Red));
        menuRed.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                menuRed.startAnimation();
            }
        });
        menuWhte = (LD_MenuButton) findViewById(R.id.menu_white);
        menuWhte.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                menuWhte.startAnimation();
            }
        });
        menuBig = (LD_MenuButton) findViewById(R.id.menu_big);
        menuBig.setColor(getResources().getColor(R.color.ld_Black));
        menuBig.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                menuBig.startAnimation();
            }
        });
        menuHuge = (LD_MenuButton) findViewById(R.id.menu_huge);
        menuHuge.setColor(getResources().getColor(R.color.ld_Orange));
        menuHuge.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                menuHuge.startAnimation();
            }
        });
    }
}

<h3>xml布局也比较简单</h3>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
        <com.dadong.ld_tools.widget.LD_MenuButton
            android:id="@+id/menu_red"
            android:background="@color/ld_White"
            android:layout_width="40dp"
            android:layout_gravity="center_horizontal"
            android:layout_margin="20dp"
            android:layout_height="40dp" />
        <com.dadong.ld_tools.widget.LD_MenuButton
            android:id="@+id/menu_white"
            android:background="@color/ld_Black"
            android:layout_width="40dp"
            android:layout_gravity="center_horizontal"
            android:layout_margin="20dp"
            android:layout_height="40dp" />
        <com.dadong.ld_tools.widget.LD_MenuButton
            android:id="@+id/menu_big"
            android:background="@color/ld_White"
            android:layout_width="80dp"
            android:layout_gravity="center_horizontal"
            android:layout_margin="20dp"
            android:layout_height="80dp" />
        <com.dadong.ld_tools.widget.LD_MenuButton
            android:id="@+id/menu_huge"
            android:background="@color/ld_White"
            android:layout_width="match_parent"
            android:layout_gravity="center_horizontal"
            android:layout_margin="20dp"
            android:layout_height="200dp" />
</LinearLayout>

<h3>Ok,下面是重点了自定义MenuButton,注释应该比较清楚,就不多解释了,也可直接拉走用</h3>

/**
 * Created by LiuDong on 2016/12/30.
 * Email:15002102128@126.com
 */
public class LD_MenuButton extends View {
    private float ratio;// 决定线的结束点位置和透明度
    private Paint paint1;// 画笔 绘制顶部线和底部线
    private Paint paint2;// 画笔 绘制中间线条
    private int color=Color.WHITE;//线条颜色 默认白色

    private int HEIGHT;// view height;
    private int WIDTH;// view width
    private int LINE_WIDTH;// 线的宽度
    private boolean isOpen = false;//判断是否展开

    public LD_MenuButton(Context context) {
        super(context);
        initPaint();
    }

    public LD_MenuButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        initPaint();
    }

    public LD_MenuButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }


    /**
     * 获取视图宽高以及初始化线宽
     * @param w
     * @param h
     * @param oldw
     * @param oldh
     */
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        // TODO Auto-generated method stub
        super.onSizeChanged(w, h, oldw, oldh);
        WIDTH = getWidth();
        HEIGHT = getHeight();
        LINE_WIDTH = HEIGHT / 15;
        paint1.setStrokeWidth(LINE_WIDTH);
        paint2.setStrokeWidth(LINE_WIDTH);
    }

    /**
     * 怎么绘制 定义怎么样的属性动画都是很自由的
     * @param canvas
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        paint2.setAlpha((int) ((1 - ratio) * 255));
        int step = (HEIGHT - LINE_WIDTH * 3) / 4;
        // **绘制上部的线
        canvas.drawLine(LINE_WIDTH, step + LINE_WIDTH / 2, WIDTH - LINE_WIDTH,
                step + LINE_WIDTH / 2 + 2 * ratio * (step + LINE_WIDTH), paint1);
        // **绘制下部的线
        canvas.drawLine(LINE_WIDTH, step + LINE_WIDTH / 2 + 2
                * (step + LINE_WIDTH), WIDTH - LINE_WIDTH, step + LINE_WIDTH
                / 2 + 2 * (1 - ratio) * (step + LINE_WIDTH), paint1);
        // **绘制中间线
        canvas.drawLine(LINE_WIDTH, HEIGHT / 2, WIDTH - LINE_WIDTH, HEIGHT / 2,
                paint2);
    }

    /**
     * 初始化画笔
     */
    private void initPaint() {
        paint1 = new Paint();
        paint1.setColor(color);
        ;
        paint2 = new Paint();
        paint2.setColor(color);

    }


    /**
     * 供属性动画调用 必须要有
     * @param ratio
     */
    public void setRatio(float ratio) {
        this.ratio = ratio;

        invalidate();
    }

    /**
     * 开始动画,自定义属性动画
     */
    public void startAnimation() {
        if (isOpen) {
            ObjectAnimator.ofFloat(this, "ratio", 1.0f, 0).setDuration(300)
                    .start();
            isOpen = false;
        } else {
            ObjectAnimator.ofFloat(this, "ratio", 0, 1.0f).setDuration(300)
                    .start();
            isOpen = true;
        }

    }

    /**
     * 设置线条颜色
     * @param color
     */
    public void setColor(int color) {
        this.color = color;
        paint1.setColor(color);
        paint2.setColor(color);
        invalidate();
    }
}

OK,有时候没事研究下这类的动画效果还是蛮有意思的,另外希望大神推荐一些进阶书籍,或好的资源等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,142评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,952评论 4 60
  • 青荷玉朵满池香 伞叶随风起绿浪 晨起湖边观美景 鹌鹑游戏在荷塘
    抗浪鱼2017阅读 188评论 0 0
  • 今天聊聊保险吧! 此时不到五点。 第一次早晨醒来,是在鸡打鸣的呼唤中,或许是因为今年是鸡年吧,声音都相当的洪亮。 ...
    龙英不悔阅读 271评论 0 0
  • 01. 这几天,一篇热文《北京,有2000万人在假装生活》刷爆了朋友圈。短短几小时,阅读上百万。当然,这篇文章也遭...
    英语老师Audrey阅读 1,265评论 16 46