package com.cheng.animationstudy.activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.util.Pair;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.cheng.animationstudy.C;
import com.cheng.animationstudy.R;
import com.cheng.utils.ViewFinder;
import com.kale.activityoptions.ActivityCompatICS;
import com.kale.activityoptions.ActivityOptionsCompatICS;
public class OptionsCompatDemoActivity extends AppCompatActivity {
public static boolean sIsSceneAnim = false;
private ImageView mOriginalIV;
private TextView mOriginalTV;
private ImageView mChromeIV;
private String mSwitchName = "testSwitch";
private boolean mTestSwitch = false;
private Intent mIntent;
// 通过handler来相应动画操作,进行动画元素的恢复
public static InnerHandler sHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_optionscompatdemo);
initData();
initView();
}
private void initData() {
SharedPreferences preferences = getSharedPreferences(C.APP_NAME, MODE_PRIVATE);
mTestSwitch = preferences.getBoolean(mSwitchName, false);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(mSwitchName, !mTestSwitch);
editor.commit();
sHandler = new InnerHandler();
this.mIntent = new Intent(OptionsCompatDemoActivity.this, OptionsCompatDemoTargetActivity.class);
}
private void initView() {
this.mOriginalIV = ViewFinder.findViewById(this, R.id.iv_original);
this.mOriginalTV = ViewFinder.findViewById(this, R.id.tv_original);
this.mChromeIV = ViewFinder.findViewById(this, R.id.iv_chrome);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_custom:
showCustomAnim();
break;
case R.id.btn_scaleUp:
showScaleUpAnim(mOriginalIV);
break;
case R.id.btn_thumbnail:
showThumbNailScaleAnim(mChromeIV);
break;
case R.id.btn_scene:
showScreenTransitAnim();
break;
}
}
/**
* 简单做一个定制的动画,这个参数很简单,传入一个进入的动画的id,和移除动画的id即可
*/
private void showCustomAnim() {
if (mTestSwitch) {
ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeCustomAnimation(
OptionsCompatDemoActivity.this,
R.anim.slide_bottom_in,
R.anim.slide_bottom_out);
ActivityCompat.startActivity(
OptionsCompatDemoActivity.this,
mIntent,
optionsCompat.toBundle());
} else {
ActivityOptionsCompatICS optionsCompatICS
= ActivityOptionsCompatICS.makeCustomAnimation(
OptionsCompatDemoActivity.this,
R.anim.slide_bottom_in,
R.anim.slide_bottom_out);
ActivityCompatICS.startActivity(
OptionsCompatDemoActivity.this,
mIntent,
optionsCompatICS.toBundle());
}
}
/**
* 这个在4.x上有用,可以实现新的Activity从某个固定的坐标以某个大小扩大至全屏
*/
private void showScaleUpAnim(View view) {
if (mTestSwitch) {
ActivityOptionsCompat optionsCompat
= ActivityOptionsCompat.makeScaleUpAnimation(
view,
0, 0, // 拉伸开始的坐标
view.getMeasuredWidth(),
view.getMeasuredHeight()
);
ActivityCompat.startActivity(
OptionsCompatDemoActivity.this,
mIntent,
optionsCompat.toBundle());
} else {
ActivityOptionsCompatICS optionsCompatICS
= ActivityOptionsCompatICS.makeScaleUpAnimation(
view,
0, 0, // 拉伸开始的坐标
view.getMeasuredWidth(),
view.getMeasuredHeight()
);
ActivityCompatICS.startActivity(
OptionsCompatDemoActivity.this,
mIntent,
optionsCompatICS.toBundle());
}
}
/**
* 这个方法可以用于4.x上,是将一个小块的Bitmpat进行拉伸的动画
*/
private void showThumbNailScaleAnim(ImageView view) {
view.setDrawingCacheEnabled(true);
Bitmap bitmap = view.getDrawingCache();
if (mTestSwitch) {
ActivityOptionsCompat optionsCompat
= ActivityOptionsCompat.makeThumbnailScaleUpAnimation(
view,
bitmap,
0, 0
);
ActivityCompat.startActivity(
OptionsCompatDemoActivity.this,
mIntent,
optionsCompat.toBundle());
} else {
ActivityOptionsCompatICS optionsCompatICS
= ActivityOptionsCompatICS.makeThumbnailScaleUpAnimation(
view,
bitmap,
0, 0
);
ActivityCompatICS.startActivity(
OptionsCompatDemoActivity.this,
mIntent,
optionsCompatICS.toBundle());
// view.setDrawingCacheEnabled(false);
}
}
private void showScreenTransitAnim() {
screenTransitAnimByPair(
Pair.create((View) mOriginalIV, R.id.target_imageView),
Pair.create((View) mOriginalTV, R.id.target_textView),
Pair.create((View) mChromeIV, R.id.target_chrome_imageView)
);
}
/**
* 当你需要当前界面中的某个元素和新界面中的元素有关时,你可以使用这个动画
*/
public void showSceneAnim(View view) {
sIsSceneAnim = true;
if (mTestSwitch) {
ActivityOptionsCompat optionsCompat
= ActivityOptionsCompat.makeSceneTransitionAnimation(
OptionsCompatDemoActivity.this,
view,
view.toString()
);
ActivityCompat.startActivity(
OptionsCompatDemoActivity.this,
mIntent,
optionsCompat.toBundle());
} else {
ActivityOptionsCompatICS optionsCompatICS
= ActivityOptionsCompatICS.makeSceneTransitionAnimation(
OptionsCompatDemoActivity.this,
view,
view.getId()
);
ActivityCompatICS.startActivity(
OptionsCompatDemoActivity.this,
mIntent,
optionsCompatICS.toBundle());
}
}
/**
* 这里可以用多个元素或者是单个元素进行动画,这里用了多个元素。为了保证动画效果,这里进行了渐变操作,
* 在handle中进行了恢复操作,这样让动画看起来平滑了很多
* @param views
*/
private void screenTransitAnimByPair(Pair<View, Integer>... views) {
sIsSceneAnim = true;
if (mTestSwitch) {
Pair<View, String>[] tViews = new Pair[views.length];
int i = 0;
for (Pair<View, Integer> view : views) {
tViews[i] = new Pair<>(view.first, view.second.toString());
i++;
}
ActivityOptionsCompat optionsCompat
= ActivityOptionsCompat.makeSceneTransitionAnimation(
OptionsCompatDemoActivity.this,
tViews
);
ActivityCompat.startActivity(
OptionsCompatDemoActivity.this,
mIntent,
optionsCompat.toBundle()
);
} else {
ActivityOptionsCompatICS optionsCompatICS
= ActivityOptionsCompatICS.makeSceneTransitionAnimation(
OptionsCompatDemoActivity.this,
views
);
ActivityCompatICS.startActivity(
OptionsCompatDemoActivity.this,
mIntent,
optionsCompatICS.toBundle()
);
}
}
class InnerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
if (msg.what == 123) {
mOriginalIV.setVisibility(View.INVISIBLE);
mOriginalTV.setVisibility(View.INVISIBLE);
mChromeIV.setVisibility(View.INVISIBLE);
} else if (msg.what == 321) {
mOriginalIV.setVisibility(View.VISIBLE);
mOriginalTV.setVisibility(View.VISIBLE);
mChromeIV.setVisibility(View.VISIBLE);
sIsSceneAnim = false;
}
}
}
}