精华内容
下载资源
问答
  • objectAnimator组合动画实现了翻牌效果
  • 因为这个 小demo很简单,就是用来熟悉一下objectAnimator的大概用法,所以我们深入浅出,直接上代码。 代码结构很简单; anim_in 这个动画类xml <objectAnimator android:duration="0" android:...

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

    代码结构很简单;

    anim_in 这个动画类xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    
        <!--消失-->
        <objectAnimator
            android:duration="0"
            android:propertyName="alpha"
            android:valueFrom="1.0"
            android:valueTo="0.0"/>
    
        <!--旋转-->
        <objectAnimator
            android:duration="@integer/anim_length"
            android:propertyName="rotationY"
            android:valueFrom="-180"
            android:valueTo="0"/>
    
        <objectAnimator
            android:duration="3000"
            android:propertyName="rotationY"
            android:valueFrom="-180"
            android:valueTo="0">
        </objectAnimator>
        <!--出现-->
        <objectAnimator
            android:duration="0"
            android:propertyName="alpha"
            android:startOffset="@integer/anim_half_length"
            android:valueFrom="0.0"
            android:valueTo="1.0"/>
    </set>
    
    
    在<set>标签中 进行 <objectAnimator>标签的动画组合,
    duration="3000" 动画持续时间
    <pre name="code" class="java">propertyName: 动画的方式 选择是旋转 哪个轴,还是 缩放,平移这些效果
    <pre name="code" class="java">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);
                }
            });
        }
    
        // 改变视角距离, 贴近屏幕<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'宋体';font-size:13.5pt;"><span style="color:#808080;">就是相当于我们打游戏的的时候滚轮放大缩小视角的感觉</span>
    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  共同进步,学习


    展开全文
  • ObjectAnimator 属性动画 和组合

    千次阅读 2018-01-17 19:53:39
    //获取屏幕高 int wallpaperDesiredMinimumHeight = context.getWallpaperDesiredMinimumHeight();... ObjectAnimator translationY = ObjectAnimator.ofFloat(view, "translationY", wallpaperDesiredMinimumHeight /
    //获取屏幕高
    int wallpaperDesiredMinimumHeight = context.getWallpaperDesiredMinimumHeight();
    //平移
     ObjectAnimator translationY = ObjectAnimator.ofFloat(view, "translationY", wallpaperDesiredMinimumHeight / 2 - 100);
    //旋转
     ObjectAnimator rotation = ObjectAnimator.ofFloat(view, "rotation",0,360);
     //透明
     ObjectAnimator alpha = ObjectAnimator.ofFloat(view, "alpha", 0 ,1);
    //缩放
     ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX",2,1);
    //组合
     AnimatorSet aa=new AnimatorSet();
     //aa.playSequentially(translationY,rotation,alpha,scaleX);
     aa.playTogether(translationY,rotation,alpha,scaleX);
     aa.setDuration(3000);
     aa.start();
     //事件
      aa.addListener(new Animator.AnimatorListener() {
          @Override
          public void onAnimationStart(Animator animator) {
    
          }
    
          @Override
          public void onAnimationEnd(Animator animator) {
                         iView.succeed();
          }
    
          @Override
          public void onAnimationCancel(Animator animator) {
    
          }
    
          @Override
          public void onAnimationRepeat(Animator animator) {
    
          }
      });
    展开全文
  • ObjectAnimator

    2019-04-10 13:35:16
    ObjectAnimator.ofFloat(v, "rotationX", 0f, 360f) .setDuration(400).start(); v:播放动画的View; rotationX:播放的方式; 0f:起始值; 360f:结束值; 起始值和结束值之间可以添加中间状态;如播放组合...

    先来个简单的例子

    ObjectAnimator.ofFloat(v, "rotationX", 0f, 360f)
            .setDuration(400).start();

    v:播放动画的View;

    rotationX:播放的方式;

    0f:起始值;

    360f:结束值;

    起始值和结束值之间可以添加中间状态;如播放组合动画中的示例;

     

    默认支持播放动画的列表

    rotationX沿着X轴旋转
    rotationY沿着Y轴旋转
    rotation沿着Z轴旋转
    scaleX沿着X轴缩放
    scaleY沿着Y轴缩放
    alpha非透明度
    translationX沿着X轴平移

    播放组合动画

    ObjectAnimator oaR = ObjectAnimator.ofFloat(v, "rotationX", 0f, 360f , 0f);
    ObjectAnimator oaSx = ObjectAnimator.ofFloat(v, "scaleX", 1f, 0f, 1f);
    ObjectAnimator oaSy = ObjectAnimator.ofFloat(v, "scaleY", 1f, 0f, 1f);
    ObjectAnimator oaA = ObjectAnimator.ofFloat(v, "alpha", 1f, 0f ,1f);
    				
    AnimatorSet set = new AnimatorSet();
    set.playTogether(oaR, oaSx, oaSy, oaA);
    set.setDuration(800).start();
    playTogether同时播放
    before在之前播放
    after在之后播放
    ObjectAnimator oaTx = ObjectAnimator.ofFloat(v, "translationX", 0f, 234f);
    ObjectAnimator oaR = ObjectAnimator.ofFloat(v, "rotationY", 0f, 360f , 0f);
    ObjectAnimator oaTx2 = ObjectAnimator.ofFloat(v, "translationX", 0f);
    AnimatorSet set = new AnimatorSet();
    set.setInterpolator(new AccelerateDecelerateInterpolator());
    set.play(oaTx).before(oaR).before(oaTx2);
    set.setDuration(1200).start();

    状态监听

    ObjectAnimator oaR = ObjectAnimator.ofFloat(v, "rotation", 0f, 360f);
    oaR.addListener(new AnimatorListener() {
        
        @Override
        public void onAnimationStart(Animator animation) {
            
        }
        
        @Override
        public void onAnimationRepeat(Animator animation) {
            
        }
        
        @Override
        public void onAnimationEnd(Animator animation) {
            
        }
        
        @Override
        public void onAnimationCancel(Animator animation) {
    
        }
    });
    oaR.setDuration(4000).start();

    自定义动画

    除了使用默认的rotationX等动画之外,也可以自定义一些动画,当然这得配合自定义View;

    在自定义View添加对应动画的get/set方法即可;

    用ImageView做个简单的例子;

    public class MyImageView extends ImageView {
    
    	int animValue = 100;
    	
    	public int getAnimValue() {
    		return animValue;
    	}
    	
    	public void setAnimValue(int value) {
    		animValue = value;
    		setTranslationX(value);
    		setTranslationY(value);
    	}
    
    	public MyImageView(Context context) {
    		super(context);
    	}
    
    	public MyImageView(Context context, AttributeSet attrs, int defStyleAttr,
    			int defStyleRes) {
    		super(context, attrs, defStyleAttr, defStyleRes);
    	}
    
    	public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) {
    		super(context, attrs, defStyleAttr);
    	}
    
    	public MyImageView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    	}
    	
    }

    调用;

    ObjectAnimator oaR = ObjectAnimator.ofInt(v, "animValue", 0, 30, 70, 0);
            oaR.setDuration(4000).start();

     

    展开全文
  • //第一个参数:指定执行动画的控件,第...public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) 动画过程监听 animator2.addUpdateListener(new ValueAnimator.Animator...
    //第一个参数:指定执行动画的控件,第二个参数:指定控件的属性,第三个参数是可变长参数
    public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) 

    动画过程监听

    animator2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            float value = (float) valueAnimator.getAnimatedValue();
            Log.i("lgq",":ssss====="+value);//动画过程监听
        }
    });

    动画状态监听

    animator2.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animator) {
            Log.i("lgq",":ssss===onAnimationStart=111=");
        }
    
        @Override
        public void onAnimationEnd(Animator animator) {
            Log.i("lgq",":ssss===onAnimationEnd==222");
            animator2.setAutoCancel(false);
        }
    
        @Override
        public void onAnimationCancel(Animator animator) {
            Log.i("lgq",":ssss===onAnimationCancel=333=");
            animator.cancel();
        }
    
        @Override
        public void onAnimationRepeat(Animator animator) {
            Log.i("lgq",":ssss===onAnimationRepeat=444=");
        }
    });

    动画暂停

    animator.pause();

    动画重新开始

    animator.resume();

    动画重复次数

    animator2.setRepeatCount(1);

    组合动画方法:

    AnimatorSet set = new AnimatorSet();
    set.play(animator).with(animator3).with(animator2);
    set.start();
    //透明度动画
    ObjectAnimator animator = ObjectAnimator.ofFloat(view,"alpha",1,0,1);  
    animator.setDuration(2000);  
    animator.start(); 
    
    //旋转动画:围绕x轴旋转
    ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"rotationX",0,270,0);  
    animator.setDuration(2000);  
    animator.start();
    
    //旋转动画:围绕y轴旋转
    ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"rotationY",0,180,0);  
    animator.setDuration(2000);  
    animator.start();
    
    //旋转动画:围绕z轴旋转
    ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"rotation",0,270,0);  
    animator.setDuration(2000);  
    animator.start();  
    
    //平移动画:在x轴上平移
    ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "translationX", 0, 200, -200,0);  
    animator.setDuration(2000);  
    animator.start(); 
    
    //平移动画:在y轴上平移
    ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "translationY", 0, 200, -100,0);  
    animator.setDuration(2000);  
    animator.start(); 
    
    //缩放动画:在x轴缩放
    ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "scaleX", 0, 3, 1);  
    animator.setDuration(2000);  
    animator.start();
    
    //缩放动画:在y轴上缩放
    ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "scaleY", 0, 3, 1);  
    animator.setDuration(2000);  
    animator.start(); 
    展开全文
  • ObjectAnimator.ofFloat(iv_top, "translationY", iv_top.getMeasuredHeight(), 0); ObjectAnimator.ofFloat(iv_halo, "Rotation", 0, 360); 属性动画可以通过AnimatorSet来排序动画播放顺序。with同时播放,...
  • Android属性动画 在Animator 框架中,使用最多的就是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator进行更加精细的控制,只控制一个对象的一个属性值,尔斯用多个ObjectAnimator组合到AnimatorSet形成一个...
  • ObjectAnimator介绍

    2017-04-11 17:32:23
    这里我们首先看看简单的用法 1.透明度变化的animator(alpha)/** * @param tvName view对象 * @param alpha 动画改变的类型也可以是scaleX,scaleY等等 ... ObjectAnimator alpha = ObjectAnimato
  • ObjectAnimator使用

    2019-08-20 22:03:19
    或者直接使用java组合使用ObjectAnimator //组合使用ObjectAnimator /*ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(mText, "scaleX", 1f, 2f); ObjectAnimator scaleYAnimator = ObjectAnimator.of...
  • AnimatorSet组合动画

    2019-06-04 15:32:21
    看了ValueAnimator和...一般而言我们不会使用ValueAnimator,只会使用ObjectAnimator组合动画实现 在AnimatorSet中提供了两个函数:playSequentially()和playTogether(),前者表示所用动画依次播放,后者表示...
  • ObjectAnimator;ObjectAnimator;ObjectAnimator;ObjectAnimator;ObjectAnimator;组合动画;组合动画;范美英. Android移动应用开发案例教程. 机械工业出版社 Android属性动画完全解析(上)初识属性动画的基本用法/...
  • 属性动画ObjectAnimator

    2016-11-16 10:42:07
    ObjectAnimator waveShiftAnim = ObjectAnimator.ofFloat( mWaveView, "waveShiftRatio", 0f, 1f); 对第二个参数不是很了解,以为是tag之类的东西。但是如果这么理解就很神奇了,他是怎么实现动画的。我就开始...
  • 属性动画之ObjectAnimator

    千次阅读 2016-06-01 16:38:33
    ObjectAnimator,通过设置改变对象的属性来实现动画效果,常用的方法有这么几种,ofFloat(),ofInt(),ofObject(),ofArgb(),ofPropertyValuesHolder(),具体含义及使用我们在下面的实例中进行讲解。 一、动画...
  • animation之objectAnimator

    千次阅读 2015-07-17 12:12:22
    这次借助github上的开源项目ShapeLoadingView来学习下ObjectAnimator和animatorSet. 代码结构目录: ShapeLoadingView.java LoadingView.java LoadingView是绘制三个基本图形的类。 ShapeLoadingView初始化图形并...
  • 属性动画ObjectAnimator: • translationX和translationY:用来沿着X轴或者Y轴进行平移。 • rotation、rotationX、rotationY:用来围绕View的支点进行旋转。 • scaleX、scaleY:横向拉伸和纵向拉伸 • alpha:...
  • ObjectAnimator设置动画

    2017-12-20 21:03:39
    //设置组合动画 AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(trans); animatorSet.play(scaleX); animatorSet.play(scaleY); animatorSet.play(alpha); animatorSet.play(rotation); //...
  • 安卓动画集合及ObjectAnimator实现旋转,移动,透明度渐变,监听动画运行中动画属性值并配合改变属性值
  • 那么接下来的问题就是怎样让setColor()方法得到调用了,毫无疑问,当然是要借助ObjectAnimator类,但是在使用ObjectAnimator之前我们还要完成一个非常重要的工作,就是编写一个用于告知系统如何进行颜色过度的...
  • ObjectAnimator;ObjectAnimator;ObjectAnimator;ObjectAnimator;ObjectAnimator;组合动画;组合动画;范美英. Android移动应用开发案例教程. 机械工业出版社 Android属性动画完全解析(上)初识属性动画的基本用法/...
  • 属性动画概念: 所谓属性动画:改变一切能改变的对象的属性值,不同于补间动画:只能改变 alpha,scale,rotate,translate。 /* * 第一个参数:目标 ... ObjectAnimator alpha = ObjectAnimator
  • 一、ObjectAnimator ObjectAnimator继承于ValueAnimator,实现了对ValueAnimator的进一步封装,因此使用方便、简单,它允许程序员对指定对象的属性执行动画。静态使用ObjectAnimator 所谓的静态使用ObjectAnimator...
  • 强大的 Android 属性动画 ObjectAnimator

    千次阅读 2015-06-02 21:26:53
    转载自:... 单一动画 例如我要移动 textView 当前位置移出屏幕,再移回初始位置 float curTranslationX = textview.getTranslationX(); ObjectAnimator animator = ObjectAnima
  • 补间动画能实现的: 1.alpha  [java] view plain copy ...//第一个参数为 view对象,第二个参数为 动画改变的类型,第三,第四个... ObjectAnimator alpha = ObjectAnimator.ofFloat(text, "alpha", 0

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,687
精华内容 1,474
关键字:

objectanimator组合