用用objectAnimator组合动画实现了翻牌效果

无聊写了一下 翻头牌的效果。享受了一把 皇帝翻妃子的快感。因为这个 小demo很简单,就是用来熟悉一下objectAnimator的大概用法,所以我们深入浅出,直接上代码。

代码结构很简单;

用用objectAnimator组合动画实现了翻牌效果_第1张图片

anim_in 这个动画类xml




    
    

    
    

    
    
    
    


标签中 进行 标签的动画组合,
duration="3000" 动画持续时间
propertyName: 动画的方式 选择是旋转 哪个轴,还是 缩放,平移这些效果
valueFrom value to 从哪里开始到 哪里结束这类的 这些属性还是比较简单 ,想详细指导 关于这些的可以自己百度资料看一下


 
  
 
  

下面我们看一下简单的逻辑实现:

MainActivity
package me.chunyu.spike.flip_anim_demo;

import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.FrameLayout;

import butterknife.Bind;
import butterknife.ButterKnife;
import me.chunyu.spike.wcl_flip_anim_demo.R;

public class MainActivity extends AppCompatActivity {

    @Bind(R.id.main_fl_container) FrameLayout mFlContainer;
    //反面
    @Bind(R.id.main_fl_card_back) FrameLayout mFlCardBack;
    //正面
    @Bind(R.id.main_fl_card_front) FrameLayout mFlCardFront;

    private AnimatorSet mRightOutSet; // 右出动画
    private AnimatorSet mLeftInSet; // 左入动画
    private boolean mIsShowBack;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        setAnimators(); // 设置动画
        setCameraDistance(); // 设置镜头距离
    }

    // 设置动画
    private void setAnimators() {
        mRightOutSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.anim_out);
        mLeftInSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.anim_in);
                 //卡牌翻转位置从右往左开始到结束
        // 设置点击事件
        mRightOutSet.addListener(new AnimatorListenerAdapter() {
            @Override public void onAnimationStart(Animator animation) {
                super.onAnimationStart(animation);
                //在动画开始执行的这个过程中,设置不能点击,不然会bao空指针等 不可预见的错误
                mFlContainer.setClickable(false);
            }
        });
        mLeftInSet.addListener(new AnimatorListenerAdapter() {
            @Override public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                mFlContainer.setClickable(true);
            }
        });
    }

    // 改变视角距离, 贴近屏幕
就是相当于我们打游戏的的时候滚轮放大缩小视角的感觉
private void setCameraDistance() { int distance = 16000; float scale = getResources().getDisplayMetrics().density * distance; mFlCardFront.setCameraDistance(scale); mFlCardBack.setCameraDistance(scale); } // 翻转卡片 public void flipCard(View view) { // 正面朝上 if (!mIsShowBack) { mRightOutSet.setTarget(mFlCardFront); mLeftInSet.setTarget(mFlCardBack); mRightOutSet.start(); mLeftInSet.start(); mIsShowBack = true; } else { // 背面朝上 mRightOutSet.setTarget(mFlCardBack); mLeftInSet.setTarget(mFlCardFront); mRightOutSet.start(); mLeftInSet.start(); mIsShowBack = false; } } @Override protected void onDestroy() { super.onDestroy(); ButterKnife.unbind(this); }}
 在这里面 我们 看一下 这个 
  
 float scale = getResources().getDisplayMetrics().density * distance;
在这里 float scale = getResources().getDisplayMetrics().density;
        //这个得到的不应该叫做密度,应该是密度的一个比例。不是真实的屏幕密度,而是相对于某个值的屏幕密度。
        //也可以说是相对密度
        /**
         * The logical density of the display. This is a scaling factor for the
         * Density Independent Pixel unit, where one DIP is one pixel on an
         * approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen),
         * providing the baseline of the system's display. Thus on a 160dpi
         * screen this density value will be 1; on a 120 dpi screen it would be
         * .75; etc.
         *
         * This value does not exactly follow the real screen size (as given by
         * xdpi and ydpi, but rather is used to scale the size of the overall UI
         * in steps based on gross changes in the display dpi. For example, a
         * 240x320 screen will have a density of 1 even if its width is
         * 1.8", 1.3", etc. However, if the screen resolution is increased to
         * 320x480 but the screen size remained 1.5"x2" then the density would
         * be increased (probably to 1.5).
         */

        /**
         * 显示器的逻辑密度,这是【独立的像素密度单位(首先明白dip是个单位)】的一个缩放因子,
         * 在屏幕密度大约为160dpi的屏幕上,一个dip等于一个px,这个提供了系统显示器的一个基线(这句我实在翻译不了)。
         * 例如:屏幕为240*320的手机屏幕,其尺寸为 1.5"*2"  也就是1.5英寸乘2英寸的屏幕
         * 它的dpi(屏幕像素密度,也就是每英寸的像素数,dpi是dot per inch的缩写)大约就为160dpi,
         * 所以在这个手机上dp和px的长度(可以说是长度,最起码从你的视觉感官上来说是这样的)是相等的。
         * 因此在一个屏幕密度为160dpi的手机屏幕上density的值为1,而在120dpi的手机上为0.75等等
         * (这里有一句话没翻译,实在读不通顺,不过通过下面的举例应该能看懂)
         * 例如:一个240*320的屏幕尽管他的屏幕尺寸为1.8"*1.3",(我算了下这个的dpi大约为180dpi多点)
         * 但是它的density还是1(也就是说取了近似值)
         * 然而,如果屏幕分辨率增加到320*480 但是屏幕尺寸仍然保持1.5"*2" 的时候(和最开始的例子比较)
         * 这个手机的density将会增加(可能会增加到1.5)
         */
                在做ui的时候,可能ui给的是px这个单位,这个时候大家可以去转换一下,或者用 “标你妹”来进行丈量,
                个人感觉这个 还是蛮好用的。

  demo 下载地址:http://download.csdn.net/detail/ningzhouxu/9622899

欢迎讨论群:166120952  共同进步,学习


你可能感兴趣的:(有趣的功能)