仿界面,重要的是实现思想
1.属性动画实现旋转
/**
* 抽取动画效果
*
* @param view 需要设定动画的控件
* @param delay 延时时间
* @param startAngle 开始的角度
* @param endAngle 结束的角度
*/
private static void animationDelayStart(View view, long delay, float startAngle, float endAngle) {
view.setPivotX(view.getWidth() / 2);//通过设定X旋转点将图片以这个点旋转
view.setPivotY(view.getHeight());//通过设定Y旋转点将图片以这个点旋转
//以设定的旋转点进行转动
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "rotation", startAngle, endAngle);
//设定延时
objectAnimator.setStartDelay(delay);
//设定动画时间
objectAnimator.setDuration(500);
//设定动画监听事件
objectAnimator.addListener(new myListener());
//开始动画
objectAnimator.start();
}
2.重写menu,实现他的三级联动
/**
* 这是获取menu键的方式2
*
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_MENU:
if (MyObjectAnimationUtil.getCount()) {
return false;
}
if (isMenuVisiable) {
//判断条目有几个
if (!is3Visiable) {
MyObjectAnimationUtil.hide(rlMenu02);
MyObjectAnimationUtil.hide(rlMenu01, 250);
} else if (!isVisiable) {
MyObjectAnimationUtil.hide(rlMenu01);
} else {
MyObjectAnimationUtil.hide(rlMenu03);
MyObjectAnimationUtil.hide(rlMenu02, 250);
MyObjectAnimationUtil.hide(rlMenu01, 500);
}
} else {//如果flase 就将所有的条目显示出来
MyObjectAnimationUtil.show(rlMenu01);
MyObjectAnimationUtil.show(rlMenu02, 250);
MyObjectAnimationUtil.show(rlMenu03, 500);
//如果已经都隐藏设定所有的boolean值为true
isVisiable = true;
is3Visiable = true;
}
isMenuVisiable = !isMenuVisiable;
break;
}
return true;
}
3.动画监听记录当下时间正在进行的动画数目
//定义一个 值用来记录正在运行的动画的数量
private static int count = 0;
//如果动画数量大于0,那就在调用的时候return;
public static boolean getCount() {
return count > 0;
}
/**
* 动画的监听事件,重写他的四个方法
*/
private static class myListener implements Animator.AnimatorListener {
@Override
public void onAnimationStart(Animator animation) {
count++;//如果开始动画count++
}
@Override
public void onAnimationEnd(Animator animation) {
count--;//如果结束动画count++
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}
布局设置
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.oblivion.defineview.MainActivity">
<RelativeLayout
android:id="@+id/rl_menu03"
android:layout_width="320dp"
android:layout_height="160dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@mipmap/level3">
<Button
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:layout_marginLeft="13dp"
android:background="@mipmap/channel1" />
<Button
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="60dp"
android:layout_marginLeft="33dp"
android:background="@mipmap/channel2" />
<Button
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="100dp"
android:layout_marginLeft="73dp"
android:background="@mipmap/channel3" />
<Button
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:background="@mipmap/channel4" />
<Button
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:layout_marginRight="13dp"
android:layout_alignParentRight="true"
android:background="@mipmap/channel7" />
<Button
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="60dp"
android:layout_marginRight="33dp"
android:background="@mipmap/channel5" />
<Button
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="100dp"
android:layout_marginRight="73dp"
android:background="@mipmap/channel6" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_menu02"
android:layout_width="210dp"
android:layout_height="105dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@mipmap/level2">
<Button
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:layout_marginLeft="13dp"
android:background="@mipmap/icon_search" />
<Button
android:id="@+id/bt_menu02"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
android:background="@mipmap/icon_menu" />
<Button
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="10dp"
android:layout_marginRight="13dp"
android:background="@mipmap/icon_myyouku" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_menu01"
android:layout_width="120dp"
android:layout_height="60dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@mipmap/level1">
<Button
android:id="@+id/bt_menu01"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:layout_centerInParent="true"
android:background="@mipmap/icon_home" />
</RelativeLayout>
</RelativeLayout>
所有的源码部分
package com.oblivion.defineview;
import android.animation.ObjectAnimator;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Property;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.RotateAnimation;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity {
@Bind(R.id.rl_menu03)
RelativeLayout rlMenu03;
@Bind(R.id.bt_menu02)
Button btMenu02;
@Bind(R.id.rl_menu02)
RelativeLayout rlMenu02;
@Bind(R.id.bt_menu01)
Button btMenu01;
@Bind(R.id.rl_menu01)
RelativeLayout rlMenu01;
//设定三级联动的boolean
private boolean isVisiable = true;
private boolean is3Visiable = true;
private boolean isMenuVisiable = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
/**
* 这是一种获取menu键的方式1
* @param featureId
* @param menu
* @return
*/
/* @Override
public boolean onMenuOpened(int featureId, Menu menu) {
Toast.makeText(MainActivity.this, "test", Toast.LENGTH_SHORT).show();
return true;
}*/
/**
* 这是获取menu键的方式2
*
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_MENU:
if (MyObjectAnimationUtil.getCount()) {
return false;
}
if (isMenuVisiable) {
//判断条目有几个
if (!is3Visiable) {
MyObjectAnimationUtil.hide(rlMenu02);
MyObjectAnimationUtil.hide(rlMenu01, 250);
} else if (!isVisiable) {
MyObjectAnimationUtil.hide(rlMenu01);
} else {
MyObjectAnimationUtil.hide(rlMenu03);
MyObjectAnimationUtil.hide(rlMenu02, 250);
MyObjectAnimationUtil.hide(rlMenu01, 500);
}
} else {//如果flase 就将所有的条目显示出来
MyObjectAnimationUtil.show(rlMenu01);
MyObjectAnimationUtil.show(rlMenu02, 250);
MyObjectAnimationUtil.show(rlMenu03, 500);
//如果已经都隐藏设定所有的boolean值为true
isVisiable = true;
is3Visiable = true;
}
isMenuVisiable = !isMenuVisiable;
break;
}
return true;
}
@OnClick({R.id.rl_menu03, R.id.bt_menu02, R.id.rl_menu02, R.id.bt_menu01, R.id.rl_menu01})
public void onClick(View view) {
switch (view.getId()) {
case R.id.bt_menu02:
if (MyObjectAnimationUtil.getCount()) {
return;
}
if (is3Visiable) {
//隐藏界面3
MyObjectAnimationUtil.hide(rlMenu03);
} else {
//显示界面3
MyObjectAnimationUtil.show(rlMenu03);
}
is3Visiable = !is3Visiable;
// MyAnimationUtils.hide();
break;
case R.id.bt_menu01:
if (MyObjectAnimationUtil.getCount()) {
return;
}
if (isVisiable) {
//隐藏界面2,3
if (!is3Visiable) {
//如果界面三已经隐藏,只设定2隐藏
MyObjectAnimationUtil.hide(rlMenu02);
is3Visiable = !is3Visiable;
isVisiable = !isVisiable;
return;
}
MyObjectAnimationUtil.hide(rlMenu02, 250);
MyObjectAnimationUtil.hide(rlMenu03);
} else {
//显示界面2,3
MyObjectAnimationUtil.show(rlMenu02);
MyObjectAnimationUtil.show(rlMenu03, 250);
}
isVisiable = !isVisiable;
break;
}
}
}
简单工具类源码部分
package com.oblivion.defineview;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.view.View;
/**
* Created by oblivion on 2016/10/21.
*/
public class MyObjectAnimationUtil {
public static void hide(View view) {
animationDelayStart(view, 0, 0f, -180f);
}
public static void show(View view) {
animationDelayStart(view, 0, -180f, 0f);
}
public static void hide(View view, long delay) {
animationDelayStart(view, delay, 0f, -180f);
}
public static void show(View view, long delay) {
animationDelayStart(view, delay, -180f, 0f);
}
/**
* 抽取动画效果
*
* @param view 需要设定动画的控件
* @param delay 延时时间
* @param startAngle 开始的角度
* @param endAngle 结束的角度
*/
private static void animationDelayStart(View view, long delay, float startAngle, float endAngle) {
view.setPivotX(view.getWidth() / 2);//通过设定X旋转点将图片以这个点旋转
view.setPivotY(view.getHeight());//通过设定Y旋转点将图片以这个点旋转
//以设定的旋转点进行转动
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "rotation", startAngle, endAngle);
//设定延时
objectAnimator.setStartDelay(delay);
//设定动画时间
objectAnimator.setDuration(500);
//设定动画监听事件
objectAnimator.addListener(new myListener());
//开始动画
objectAnimator.start();
}
//定义一个 值用来记录正在运行的动画的数量
private static int count = 0;
//如果动画数量大于0,那就在调用的时候return;
public static boolean getCount() {
return count > 0;
}
/**
* 动画的监听事件,重写他的四个方法
*/
private static class myListener implements Animator.AnimatorListener {
@Override
public void onAnimationStart(Animator animation) {
count++;//如果开始动画count++
}
@Override
public void onAnimationEnd(Animator animation) {
count--;//如果结束动画count++
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}
}