Android动画动画二
标签: Android 动画属性
1、使用xml文件来创建属性动画
使用XML来写动画属性
在res文件夹下新建一个文件夹:animator
然后新建XML文件:scale.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:duration="2000"
android:valueFrom="1.0"
android:valueTo="2.0"
android:valueType="floatType"
android:propertyName="scaleX">
</objectAnimator>
<objectAnimator
android:duration="2000"
android:valueFrom="1.0"
android:valueTo="2.0"
android:valueType="floatType"
android:propertyName="scaleY">
</objectAnimator>
</set>
orderring属性设置为together,使得动画同时发生。
动画调用代码:
public void scaleX(View view){
Animator animation = AnimatorInflater.loadAnimator(this, R.animator.scalex);
animation.setTarget(mImageView);
animation.start();
}
实现了X,Y的宽度增加一倍。
设置中心点(变化相对于这个点):
public void scaleX(View view){
Animator animation = AnimatorInflater.loadAnimator(this, R.animator.scalex);
animation.setTarget(mImageView);
mImageView.setPivotX(0);
mImageView.setPivotY(0);
//显示的调用invalidate
mImageView.invalidate();
animation.start();
}
2、布局动画(Layout animations)
主要使用LayoutTransition为布局的容器设置动画,当容器中的视图层次发生变化时存在过渡的动画效果。
LayoutTransition.APPEARING 当一个View在ViewGroup中出现时,对此View设置的动画
LayoutTransition.CHANGE_APPEARING 当一个View在ViewGroup中出现时,对此View对其他View位置造成影响,对其他View设置的动画
LayoutTransition.DISAPPEARING 当一个View在ViewGroup中消失时,对此View设置的动画
LayoutTransition.CHANGE_DISAPPEARING 当一个View在ViewGroup中消失时,对此View对其他View位置造成影响,对其他View设置的动画
LayoutTransition transition = new LayoutTransition();
transition.setAnimator(LayoutTransition.CHANGE_APPEARING,
transition.getAnimator(LayoutTransition.CHANGE_APPEARING));
transition.setAnimator(LayoutTransition.APPEARING,
null);
transition.setAnimator(LayoutTransition.DISAPPEARING,
null);
transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,
null);
mGridLayout.setLayoutTransition(transition);
3、具体例子
public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
private CheckBox mAppear,mChangeAppear,mDisappear,mChangeDisappear;
ViewGroup mViewGroup ;
GridLayout mGridLayout;
int val;
LayoutTransition mTransition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewGroup = (ViewGroup) findViewById(R.id.view_container);
mAppear = (CheckBox) findViewById(R.id.appear);
mChangeAppear = (CheckBox) findViewById(R.id.change_appear);
mDisappear = (CheckBox) findViewById(R.id.disappear);
mChangeDisappear = (CheckBox) findViewById(R.id.change_disappear);
mAppear.setOnCheckedChangeListener(this);
mChangeDisappear.setOnCheckedChangeListener(this);
mChangeAppear.setOnCheckedChangeListener(this);
mDisappear.setOnCheckedChangeListener(this);
//创建一个GridLayout
mGridLayout = new GridLayout(this);
//设置5个按钮
mGridLayout.setColumnCount(5);
mViewGroup.addView(mGridLayout);
//动画全部开启
mTransition = new LayoutTransition();
mGridLayout.setLayoutTransition(mTransition);
}
/**
* 添加按键
* @param view
*/
public void addButton(View view){
final Button button = new Button(this);
button.setText(++val+"");
mGridLayout.addView(button, Math.min(1, mGridLayout.getChildCount()));
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mGridLayout.removeView(button);
}
});
}
//CheckBox点击事件监听
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//新建的LayoutTransition拥有所有的默认动画,或者说动画全开
mTransition = new LayoutTransition();
//根据是否checked设置对应动画还是没有动画
mTransition.setAnimator(LayoutTransition.APPEARING,mAppear.isChecked()?mTransition.getAnimator(LayoutTransition.APPEARING):null);
mTransition.setAnimator(LayoutTransition.CHANGE_APPEARING,mChangeAppear.isChecked()?mTransition.getAnimator(LayoutTransition.CHANGE_APPEARING):null);
mTransition.setAnimator(LayoutTransition.DISAPPEARING,mDisappear.isChecked()?mTransition.getAnimator(LayoutTransition.DISAPPEARING):null);
mTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,mChangeDisappear.isChecked()?mTransition.getAnimator(LayoutTransition.CHANGE_DISAPPEARING):null);
//设置自定义动画
//mTransition.setAnimator(LayoutTransition.APPEARING,mAppear.isChecked()? ObjectAnimator.ofFloat(this,"scaleX",0,1):null);
mGridLayout.setLayoutTransition(mTransition);
}
}
View的anim方法
在SDK11的时候,给View添加了animate方法,更加方便的实现动画效果。
布局文件:
<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"
>
<ImageView
android:id="@+id/id_ball"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bol_blue" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="viewAnim"
android:text="View Anim" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="propertyValuesHolder"
android:text="PropertyValuesHolder " />
</LinearLayout>
</RelativeLayout>
活动代码:
public class ViewAnimateActivity extends Activity
{
protected static final String TAG = "ViewAnimateActivity";
private ImageView mBlueBall;
private float mScreenHeight;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.view_animator);
DisplayMetrics outMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
mScreenHeight = outMetrics.heightPixels;
mBlueBall = (ImageView) findViewById(R.id.id_ball);
}
public void viewAnim(View view)
{
// need API12
mBlueBall.animate()//
.alpha(0)//
.y(mScreenHeight / 2).setDuration(1000)
// need API 12
.withStartAction(new Runnable()
{
@Override
public void run()
{
Log.e(TAG, "START");
}
// need API 16
}).withEndAction(new Runnable()
{
@Override
public void run()
{
Log.e(TAG, "END");
runOnUiThread(new Runnable()
{
@Override
public void run()
{
mBlueBall.setY(0);
mBlueBall.setAlpha(1.0f);
}
});
}
}).start();
}
}
简单的使用
mBlueBall.animate().alpha(0).y(mScreenHeight /2).setDuration(1000).start();
相当于直接设置最后的结果就可以,比较方便
就能实现动画~~不过需要SDK11,此后在SDK12,SDK16又分别添加了withStartAction和withEndAction用于在动画前,和动画后执行一些操作。当然也可以.setListener(listener)等操作。
使用ObjectAnimator实现上面的变化,我们可以使用:PropertyValueHolder
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat(“alpha”, 1f,0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat(“y”, 0,mScreenHeight / 2, 0);
ObjectAnimator.ofPropertyValuesHolder(mBlueBall, pvhX, pvhY).setDuration(1000).start();
效果与上面一样。