【移动应用开发技术】Android动画知识有哪些_第1页
【移动应用开发技术】Android动画知识有哪些_第2页
【移动应用开发技术】Android动画知识有哪些_第3页
【移动应用开发技术】Android动画知识有哪些_第4页
【移动应用开发技术】Android动画知识有哪些_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】Android动画知识有哪些

//初始化

Animation

alphaAnimation

=

new

AlphaAnimation(0.1f,

1.0f);

//设置动画时间

alphaAnimation.setDuration(3000);

this.startAnimation(alphaAnimation);

Animation

rotateAnimation

=

new

RotateAnimation(0f,

360f);

rotateAnimation.setDuration(1000);

this.startAnimation(rotateAnimation);

//初始化

Animation

scaleAnimation

=

new

ScaleAnimation(0.1f,

1.0f,0.1f,1.0f);

//设置动画时间

scaleAnimation.setDuration(500);

this.startAnimation(scaleAnimation);

//初始化

nimation

translateAnimation

=

new

TranslateAnimation(0.1f,

100.0f,0.1f,100.0f);

//设置动画时间

translateAnimation.setDuration(1000);

this.startAnimation(translateAnimation);

//初始化

Translate动画

translateAnimation

=

new

TranslateAnimation(0.1f,

100.0f,0.1f,100.0f);

//初始化

Alpha动画

alphaAnimation

=

new

AlphaAnimation(0.1f,

1.0f);

//动画集

AnimationSet

set

=

new

AnimationSet(true);

set.addAnimation(translateAnimation);

set.addAnimation(alphaAnimation);

//设置动画时间

(作用到每个动画)

set.setDuration(1000);

this.startAnimation(set);

<set

android:interpolator="@android:anim/accelerate_interpolator">

</set>

<?xml

version="1.0"

encoding="utf-8"?>

<InterpolatorName

xmlns:android="/apk/res/android"

android:attribute_name="value"

/>

<?xml

version="1.0"

encoding="utf-8"?>

<overshootInterpolator

xmlns:android="/apk/res/android"

android:tension="7.0"/>

<scale

xmlns:android="/apk/res/android"

android:interpolator="@anim/my_overshoot_interpolator"

android:fromXScale="1.0"

android:toXScale="3.0"

android:fromYScale="1.0"

android:toYScale="3.0

android:pivotX="50%"

android:pivotY="50%"

android:duration="700"

/>

public

float

getInterpolation(float

input)

{

return

input;

}

public

float

getInterpolation(float

input)

{

return

(float)(Math.cos((input

+

1)

*

Math.PI)

/

2.0f)

+

0.5f;

}

1)计算属性值/upload/information/20200311/46/191991.jpg

核心类:/upload/information/20200311/46/191992.jpgValueAnimator

animation

=

ValueAnimator.ofFloat(0f,

1f);

animation.setDuration(1000);

animation.addUpdateListener(new

AnimatorUpdateListener()

{

@Override

public

void

onAnimationUpdate(ValueAnimator

animation)

{

Log.i("update",

((Float)

animation.getAnimatedValue()).toString());

}

});

animation.setInterpolator(new

CycleInterpolator(3));

animation.start();

ObjectAnimator

animX

=

ObjectAnimator.ofFloat(myView,

"x",

50f);

ObjectAnimator

animY

=

ObjectAnimator.ofFloat(myView,

"y",

100f);

AnimatorSet

animSetXY

=

new

AnimatorSet();

animSetXY.playTogether(animX,

animY);

animSetXY.start();ropertyValuesHolder

pvhX

=

PropertyValuesHolder.ofFloat("x",

50f);

PropertyValuesHolder

pvhY

=

PropertyValuesHolder.ofFloat("y",

100f);

ObjectAnimator.ofPropertyValuesHolder(myView,

pvhX,

pvyY).start();myView.animate().x(50f).y(100f);//myView.animate()直接返回一个ViewPropertyAnimator对象Keyframe

kf0

=

Keyframe.ofFloat(0f,

0f);

Keyframe

kf1

=

Keyframe.ofFloat(.5f,

360f);

Keyframe

kf2

=

Keyframe.ofFloat(1f,

0f);

PropertyValuesHolder

pvhRotation

=

PropertyValuesHolder.ofKeyframe("rotation",

kf0,

kf1,

kf2);//动画属性名,可变参数

ObjectAnimator

rotationAnim

=

ObjectAnimator.ofPropertyValuesHolder(target,

pvhRotation)

rotationAnim.setDuration(5000);public

static

KeyframeSet

ofFloat(float...

values)

{

int

numKeyframes

=

values.length;

FloatKeyframe

keyframes[]

=

new

FloatKeyframe[Math.max(numKeyframes,2)];

if

(numKeyframes

==

1)

{

keyframes[0]

=

(FloatKeyframe)

Keyframe.ofFloat(0f);

keyframes[1]

=

(FloatKeyframe)

Keyframe.ofFloat(1f,

values[0]);

}

else

{

keyframes[0]

=

(FloatKeyframe)

Keyframe.ofFloat(0f,

values[0]);

for

(int

i

=

1;

i

<

numKeyframes;

++i)

{

keyframes[i]

=

(FloatKeyframe)

Keyframe.ofFloat((float)

i

/

(numKeyframes

-

1),

values[i]);//这里是关键

}

}

return

new

FloatKeyframeSet(keyframes);<set

android:ordering="sequentially">

<set>

<objectAnimator

android:propertyName="x"

android:duration="500"

android:valueTo="400"

android:valueType="intType"/>

<objectAnimator

android:propertyName="y"

android:duration="500"

android:valueTo="300"

android:valueType="intType"/>

</set>

<objectAnimator

android:propertyName="alpha"

android:duration="500"

android:valueTo="1f"/>

</set>AnimatorSet

set

=

(AnimatorSet)

AnimatorInflater.loadAnimator(myContext,

R.perty_animator);

set.setTarget(myObject);

set.start();<set

android:ordering=["together"

|

"sequentially"]>

<objectAnimator

android:propertyName="string"

android:duration="int"

android:valueFrom="float

|

int

|

color"

android:valueTo="float

|

int

|

color"

android:startOffset="int"

android:repeatCount="int"

android:repeatMode=["repeat"

|

"reverse"]

android:valueType=["intType"

|

"floatType"]/>

<animator

android:duration="int"

android:valueFrom="float

|

int

|

color"

android:valueTo="float

|

int

|

color"

android:startOffset="int"

android:repeatCount="int"

android:repeatMode=["repeat"

|

"reverse"]

android:valueType=["intType"

|

"floatType"]/>

<set>

...

</set>

</set><Button

android:id="@+id/btn_1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/btn_1"

android:padding="10px"

android:layout_below="@id/touch_feedback_ripple_textview"

/>

<Button

android:id="@+id/btn_2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/btn_2"

android:layout_below="@id/btn_1"

android:padding="10px"

android:background="?android:attr/selectableItemBackground"/>

<Button

android:id="@+id/btn_3"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/btn_3"

android:layout_below="@id/btn_2"

android:padding="10px"

android:background="?android:attr/selectableItemBackgroundBorderless"/>/upload/information/20200311/46/191993.jpg

public

static

Animator

createCircularReveal(View

view,nt

centerX,

int

centerY,

float

startRadius,

float

endRadius)

{

return

new

RevealAnimator(view,

centerX,

centerY,

startRadius,

endRadius);

}final

View

oval

=

this.findViewById(R.id.oval);

oval.setOnClickListener(new

View.OnClickListener()

{

@Override

public

void

onClick(View

v)

{

Animator

animator

=

ViewAnimationUtils.createCircularReveal(

oval,oval.getWidth()/2,oval.getHeight()/2,oval.getWidth(),0);

animator.setInterpolator(new

AccelerateDecelerateInterpolator());

animator.setDuration(2000);

animator.start();

}

});

final

View

rect

=

this.findViewById(R.id.rect);

rect.setOnClickListener(new

View.OnClickListener()

{

@Override

public

void

onClick(View

v)

{

Animator

animator

=

ViewAnimationUtils.createCircularReveal(

rect,0,0,0,(float)

Math.hypot(rect.getWidth(),

rect.getHeight()));

animator.setInterpolator(new

AccelerateInterpolator());

animator.setDuration(2000);

animator.start();

}

});

/upload/information/20200311/46/191994.jpg<?xml

version="1.0"

encoding="utf-8"?>

<fade

xmlns:android="/apk/res/"

android:duration="1000"/>

res/transition/activity_slide.xml

<?xml

version="1.0"

encoding="utf-8"?>

<slide

xmlns:android="/apk/res/"

android:duration="1000"/>

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_transition);

setupWindowAnimations();

}

private

void

setupWindowAnimations()

{

Slide

slide

=

TransitionInflater.from(this).inflateTransition(R.transition.activity_slide);

getWindow().setExitTransition(slide);

}

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_transition);

setupWindowAnimations();

}

private

void

setupWindowAnimations()

{

Fade

fade

=

TransitionInflater.from(this).inflateTransition(R.transition.activity_fade);

getWindow().setEnterTransition(fade);

}

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_transition);

setupWindowAnimations();

}

private

void

setupWindowAnimations()

{

Slide

slide

=

new

Slide();

slide.setDuration(1000);

getWindow().setExitTransition(slide);

}

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_transition);

setupWindowAnimations();

}

private

void

setupWindowAnimations()

{

Fade

fade

=

new

Fade();

fade.setDuration(1000);

getWindow().setEnterTransition(fade);

}

<resources>

<style

name="AppTheme"

parent="Theme.AppCompat.Light.DarkActionBar">

<item

name="colorPrimary">@color/colorPrimary</item>

<item

name="colorPrimaryDark">@color/colorPrimaryDark</item>

<item

name="colorAccent">@color/colorAccent</item>

<!--设置选中的颜色-->

<!--

允许使用transitions

-->

<item

name="android:windowContentTransitions">true</item>

<!--是否覆盖执行,其实可以理解成是否同步执行还是顺序执行-->

<item

name="android:windowAllowEnterTransitionOverlap">false</item>

<item

name="android:windowAllowReturnTransitionOverlap">false</item>

</style>

</resources>

@Override

public

void

onClick(View

v)

{

ArrayList<Pair<View,String>>

arrayList

=

new

ArrayList<Pair<View,String>>();

switch

(v.getId())

{

case

R.id.explode_btn:

setExplodeTransition();

flag

=

AnimConstant.EXPLODE_FLAG;

break;

case

R.id.slide_btn:

setSlideTransition();

flag

=

AnimConstant.SLIDE_FLAG;

break;

case

R.id.pade_in_out_btn:

setFadeTransition();

flag

=

AnimConstant.PADE_IN_OUT_FLAG;

break;

case

R.id.shared_element_btn:

arrayList.add(new

Pair<View,

String>(shareElementBtn,

"shared_name_btn"));

flag

=

AnimConstant.SHARED_ELEMENTS_FLAG;

break;

}

startActivity(arrayList);

}

private

void

setFadeTransition()

{

Fade

fadeTransition

=

new

Fade();

fadeTransition.setDuration(1000);

getWindow().setReenterTransition(fadeTransition);

getWindow().setExitTransition(fadeTransition);

}

private

void

startActivity(ArrayList<Pair<View,

String>>

arrayList)

{

Intent

intent

=

new

Intent();

intent.setClass(this

,SecondActivity.class);

intent.putExtra("transition_flag",flag);

ActivityOptionsCompat

options

=

ActivityOptionsCompat.makeSceneTransitionAnimation(this,

arrayList.toArray(new

Pair[arrayList.size()]));

startActivity(intent,

options.toBundle());

}

private

void

setExplodeTransition()

{

Explode

explode

=

new

Explode();

explode.setDuration(2000);

getWindow().setReenterTransition(explode);

getWindow().setExitTransition(explode);

}

private

void

setSlideTransition()

{

Slide

slideTransition

=

new

Slide();

slideTransition.setSlideEdge(Gravity.LEFT);

slideTransition.setDuration(1000);

getWindow().setReenterTransition(slideTransition);

getWindow().setExitTransition(slideTransition);

}

private

Button

returnBtn

=

null;

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

Intent

intent

=

getIntent();

int

flag

=

intent.getIntExtra("transition_flag"

,-1);

if

(flag

!=

AnimConstant.SHARED_ELEMENTS_FLAG)

{

setupWindowAnimations();

}

returnBtn

=

(Button)

this.findViewById(R.id.return_btn);

returnBtn.setOnClickListener(new

View.OnClickListener()

{

@Override

public

void

onClick(View

v)

{

finishAfterTransition();

}

});

}

private

void

setupWindowAnimations()

{

Explode

explode

=

new

Explode();

explode.setDuration(2000);

getWindow().setEnterTransition(explode);

}/upload/information/20200311/46/191995.jpg<pathInterpolator

xmlns:android="/apk/res/android"

android:controlX1="0.4"

android:controlY1="0"

android:controlX2="1"

android:controlY2="1"/>public

class

SCPahtInterpolator

extends

PathInterpolator

{

public

static

final

float

DEFALUT_CONTROL_1_X

=

0.5f;

public

static

final

float

DEFALUT_CONTROL_1_Y

=

0f;

public

static

final

float

DEFALUT_CONTROL_2_X

=

0f;

public

static

final

float

DEFALUT_CONTROL_2_Y

=

1f;

public

SCPahtInterpolator()

{

super(DEFALUT_CONTROL_1_X,

DEFALUT_CONTROL_1_Y,

DEFALUT_CONTROL_2_X,

DEFALUT_CONTROL_2_Y);

}

public

SCPahtInterpolator(Path

path)

{

super(path);

}

public

SCPahtInterpolator(float

controlX,

float

controlY)

{

super(controlX,

controlY);

}

public

SCPahtInterpolator(float

controlX1,

float

controlY1,

float

controlX2,

float

controlY2)

{

super(controlX1,

controlY1,

controlX2,

controlY2);

}

public

SCPahtInterpolator(Context

context,

AttributeSet

attrs)

{

super(context,

attrs);

}

}ObjectAnimator

mAnimator;

mAnimator

=

ObjectAnimator.ofFloat(view,

View.X,

View.Y,

path);

...

mAnimator.start();<!--

animate

the

translationZ

property

of

a

view

when

pressed

-->

<selector

xmlns:android="/apk/res/android">

<item

android:state_pressed="true">

<set>

<objectAnimator

android:propertyName="translationZ"

android:duration="@android:integer/config_shortAnimTime"

android:valueTo="2dp"

android:valueType="floatType"/>

<!--

you

could

have

other

objectAnimator

elements

here

for

"x"

and

"y",

or

other

properties

-->

</set>

</item>

<item

android:state_enabled="true"

android:state_pressed="false"

android:state_focused="true">

<set>

<objectAnimator

android:propertyName="translationZ"

android:duration="100"

android:valueTo="0"

android:valueType="floatType"/>

</set>

</item>

</selector><!--

res/drawable/myanimstatedrawable.xml

-->

<animated-selector

xmlns:android="/apk/res/android">

<!--

provide

a

different

drawable

for

each

state-->

<item

android:id="@+id/pressed"

android:drawable="@drawable/drawableP"

android:state_pressed="true"/>

<item

android:id="@+id/focused"

android:drawable="@drawable/drawableF"

android:state_focused="true"/>

<item

android:id="@id/default"

android:drawable="@drawable/drawableD"/>

<!--

specify

a

transition

-->

<tra

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论