Android 自定义属性动画应用之MenuButton
a6802739
8年前
<p>之前做App 有需要一个按钮需要有动画,点击展开变成X ,再次点击变回三根线,好像这东西在html中很好实现,于是我也在android里也做了一次小的应用,直接</p> <h3>效果图</h3> <p><img src="https://simg.open-open.com/show/b0ec328cec9084d9193bcf3cf922ae59.gif"></p> <p>menubtn.gif</p> <p>那么怎么实现呢?</p> <p>思路:</p> <p>① 首先要绘制三根线</p> <p>②观察发现,上下两根线只需要坐标互换下,也就是线的一端位置发生了变化,中间线由完全不透明变成透明</p> <p>③那么这种数值变化并且还需要动画的,我们自然而然的想到了</p> <h3>属性动画</h3> <p>④那么OK,我们只需要声明个属性radio,根据这个数值变化做属性变化绘制就OK了</p> <p>晕-----写完了怎么只保存到这---补全中------------</p> <h3>先上调用Activity了</h3> <pre> <code class="language-java">/** * 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(); } }); } }</code></pre> <h3>xml布局也比较简单</h3> <pre> <code class="language-java"><?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></code></pre> <h3>Ok,下面是重点了自定义MenuButton,注释应该比较清楚,就不多解释了,也可直接拉走用</h3> <pre> <code class="language-java">/** * 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(); } }</code></pre> <p>OK,有时候没事研究下这类的动画效果还是蛮有意思的,另外希望大神推荐一些进阶书籍,或好的资源等。</p> <p> </p> <p>来自:http://www.jianshu.com/p/a788e74663ea</p> <p> </p>