Android 在启动CustomViewPager时启动动画
我成功地在CustomViewPager的开始处创建了一个动画,它的作用类似于旋转木马。在这里,我的物品从左边来,3秒钟后就到了右边。问题是这只是一个翻译,我想知道是否有可能让我的viewpager从很远的地方滚动到他的最终位置 你有办法做到这一点吗? 问候 编辑:所以我尝试了其他方法,并创建了我的自定义滚动动画。我成功地创造了我想要的东西,但是动作不流畅,你能帮我吗。我的新代码:Android 在启动CustomViewPager时启动动画,android,animation,scroll,onstart,Android,Animation,Scroll,Onstart,我成功地在CustomViewPager的开始处创建了一个动画,它的作用类似于旋转木马。在这里,我的物品从左边来,3秒钟后就到了右边。问题是这只是一个翻译,我想知道是否有可能让我的viewpager从很远的地方滚动到他的最终位置 你有办法做到这一点吗? 问候 编辑:所以我尝试了其他方法,并创建了我的自定义滚动动画。我成功地创造了我想要的东西,但是动作不流畅,你能帮我吗。我的新代码: import android.support.v4.view.ViewPager; import android.
import android.support.v4.view.ViewPager;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import java.util.Calendar;
public class ScrollToAnimation extends Animation {
private int currentIndex = 0, nbChilds = -1, deltaT = 0;
private float fromX, toX;
private long animationStart;
private ViewPager viewpager;
public ScrollToAnimation(ViewPager viewpager, float fromX, float toX, int duration) {
this.viewpager = viewpager;
this.fromX = fromX;
this.toX = toX;
nbChilds = viewpager.getChildCount();
deltaT = duration / nbChilds;
setDuration(duration);
animationStart = Calendar.getInstance().getTimeInMillis();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
int offset = (int) (-fromX * interpolatedTime + fromX);
viewpager.scrollTo(offset, 0);
long animationProgression = Calendar.getInstance().getTimeInMillis() - animationStart;
currentIndex = (int) (animationProgression/deltaT);
if(viewpager.getCurrentItem() != currentIndex) {
viewpager.setCurrentItem(nbChilds-currentIndex, false);
}
}
}
ViewPager:
import android.content.Context;
import android.graphics.Canvas;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.animation.Animation;
import android.view.animation.Interpolator;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class CarouselViewPager extends ViewPager {
private DisplayMetrics metrics;
private Animation animation;
private SpeedScroller mScroller = null;
private boolean animationNotStarted = true, leftToRight;
public CarouselViewPager(Context context) {
super(context);
postInitViewPager();
metrics = getContext().getResources().getDisplayMetrics();
}
public CarouselViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
postInitViewPager();
metrics = getContext().getResources().getDisplayMetrics();
}
private void postInitViewPager() {
try {
Class<?> viewpager = ViewPager.class;
Field scroller = viewpager.getDeclaredField("mScroller");
scroller.setAccessible(true);
Field interpolator = viewpager.getDeclaredField("sInterpolator");
interpolator.setAccessible(true);
mScroller = new SpeedScroller(getContext(), (Interpolator) interpolator.get(null));
scroller.set(this, mScroller);
} catch (Exception e) {
Log.e("postInitViewPager", e.getMessage());
}
}
public void setScrollDurationFactor(double scrollFactor) {
mScroller.setScrollDurationFactor(scrollFactor);
}
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
try {
Method method = ViewPager.class.getDeclaredMethod("setCurrentItemInternal", int.class, boolean.class, boolean.class, int.class);
method.setAccessible(true);
method.invoke(this, item, true, false, 1500);
} catch (Exception e) {
e.printStackTrace();
super.setCurrentItem(item, smoothScroll);
}
}
public void startAnimation(boolean leftToRight) {
animation = new ScrollToAnimation(this, ((metrics.widthPixels/2)+200)*2, 0, 2000);
animationNotStarted = false;
this.leftToRight = leftToRight;
}
private Canvas enterAnimation(final Canvas c) {
animationNotStarted = true;
startAnimation(animation);
scrollTo(0, 0);
return c;
}
@Override
protected void onDraw(Canvas canvas) {
if (!animationNotStarted) {
canvas = enterAnimation(canvas);
}
super.onDraw(canvas);
}
}
导入android.content.Context;
导入android.graphics.Canvas;
导入android.support.v4.view.ViewPager;
导入android.util.AttributeSet;
导入android.util.DisplayMetrics;
导入android.util.Log;
导入android.view.animation.animation;
导入android.view.animation.Interpolator;
导入java.lang.reflect.Field;
导入java.lang.reflect.Method;
公共类CarouseViewPager扩展了ViewPager{
私有显示度量;
私人动画;
私人SpeedScroller mScroller=null;
私有布尔animationNotStarted=true,leftToRight;
公共旋转视图管理器(上下文){
超级(上下文);
postInitViewPager();
metrics=getContext().getResources().getDisplayMetrics();
}
公共carouselviewPage(上下文、属性集属性){
超级(上下文,attrs);
postInitViewPager();
metrics=getContext().getResources().getDisplayMetrics();
}
私有void postInitViewPager(){
试一试{
Class viewpager=viewpager.Class;
字段滚动器=viewpager.getDeclaredField(“mScroller”);
scroller.setAccessible(true);
字段插值器=viewpager.getDeclaredField(“sInterpolator”);
插值器.setAccessible(true);
mScroller=newspeedscroller(getContext(),(Interpolator)Interpolator.get(null));
scroller.set(这个,mScroller);
}捕获(例外e){
Log.e(“postInitViewPager”,e.getMessage());
}
}
公共无效设置CrollDurationFactor(双滚动系数){
mScroller.setScrollDurationFactor(滚动系数);
}
@凌驾
public void setCurrentItem(int项,布尔平滑滚动){
试一试{
方法Method=ViewPager.class.getDeclaredMethod(“setCurrentItemInternal”,int.class,boolean.class,boolean.class,int.class);
方法setAccessible(true);
调用(this,item,true,false,1500);
}捕获(例外e){
e、 printStackTrace();
super.setCurrentItem(项目,平滑滚动);
}
}
public void startAnimation(布尔值leftToRight){
动画=新的滚动动画(这,((metrics.widthPixels/2)+200)*2,020000);
animationnotstart=false;
this.leftToRight=leftToRight;
}
私有画布动画(最终画布c){
animationnotstart=true;
startAnimation(动画);
滚动到(0,0);
返回c;
}
@凌驾
受保护的void onDraw(画布){
如果(!animationnotstart){
画布=动画(画布);
}
super.onDraw(帆布);
}
}
编辑2:
这里有一个截图来帮助你理解我想要什么。实际上,我有一个自定义的viewpager,如下所示:
我想要的动画如下所示:
- 当我启动动画时,项目离我很远李>
- 之后,它们从左到右(或相反)停在所选项目上,但我希望在项目滚动时具有缩放效果李>
- 由于使用了自定义适配器,我成功地创建了缩放效果
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class CarouselAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener {
private float scale;
private MainActivity context;
private FragmentManager fragmentManager;
private ArrayList<Entity> entities = new ArrayList<>();
private ScaledFrameLayout cur = null, next = null;
public CarouselAdapter(MainActivity context, FragmentManager fragmentManager, ArrayList<Entity> mData) {
super(fragmentManager);
this.fragmentManager = fragmentManager;
this.context = context;
this.entities = mData;
}
@Override
public Fragment getItem(int position) {
if (position == MainActivity.FIRST_PAGE) {
scale = MainActivity.BIG_SCALE;
} else {
scale = MainActivity.SMALL_SCALE;
}
Fragment fragment = CarouselFragment.newInstance(context, entities.get(position), position, scale);
return fragment;
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
@Override
public int getCount() {
return entities.size();
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (positionOffset >= 0f && positionOffset <= 1f) {
cur = getRootView(position);
cur.setScaleBoth(MainActivity.BIG_SCALE - MainActivity.DIFF_SCALE * positionOffset);
if (position < entities.size()-1) {
next = getRootView(position + 1);
next.setScaleBoth(MainActivity.SMALL_SCALE + MainActivity.DIFF_SCALE * positionOffset);
}
}
}
@Override
public void onPageSelected(int position) { }
@Override
public void onPageScrollStateChanged(int state) {}
private ScaledFrameLayout getRootView(int position) {
return (ScaledFrameLayout) fragmentManager.findFragmentByTag(this.getFragmentTag(position)).getView().findViewById(R.id.rootItem);
}
private String getFragmentTag(int position) {
return "android:switcher:" + context.carousel.getId() + ":" + position;
}
}
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentManager;
导入android.support.v4.app.FragmentPagerAdapter;
导入android.support.v4.view.ViewPager;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
导入android.widget.ImageButton;
导入android.widget.ImageView;
导入android.widget.TextView;
导入java.util.ArrayList;
公共类CarouselAdapter扩展了FragmentPagerAdapter,实现了ViewPager.OnPageChangeListener{
私人浮动比例;
私人活动语境;
私人碎片管理器碎片管理器;
私有ArrayList实体=新ArrayList();
私有ScaledFrameLayout cur=null,next=null;
公共旋转木马适配器(主活动上下文、FragmentManager FragmentManager、ArrayList mData){
超级(碎片管理器);
this.fragmentManager=fragmentManager;
this.context=上下文;
this.entities=mData;
}
@凌驾
公共片段getItem(int位置){
如果(位置==MainActivity.FIRST_页){
scale=MainActivity.BIG_scale;
}否则{
规模=主要活动。小规模;
}
Fragment Fragment=CarouselFragment.newInstance(上下文、entities.get(位置)、位置、比例);
返回片段;
}
@凌驾
public int getItemPosition(对象){
返回super.getItemPosition(对象);
}
@凌驾
public int getCount(){
返回实体的大小();
}
@凌驾
已滚动页面上的公共无效(int-position、float-positionOffset、int-positionOffsetPixels){
如果(positionOffset>=0f&&positionOffset尝试使用平滑视图寻呼机,您可以配置它的速度。您只需将其设置为0位置,然后使其可见,然后将其移动到目标位置,他将平滑地滚动到目标位置,如果需要,您可以像普通视图寻呼机一样应用任何动画。此外,您还可以设置分页功能
到
public class SmoothScrollViewPager extends ViewPager {
private boolean enabled = true;
public SmoothScrollViewPager(Context context, AttributeSet attrs) {
super( context, attrs );
setMyScroller();
}
private void setMyScroller() {
try {
Class<?> viewpager = ViewPager.class;
Field scroller = viewpager.getDeclaredField("mScroller");
scroller.setAccessible(true);
scroller.set(this, new MyScroller(getContext()));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onTouchEvent(event);
}
return false;
}
public class MyScroller extends Scroller {
public MyScroller(Context context) {
super(context, new DecelerateInterpolator());
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, 1000 /*1 secs*/);
}
}
public void setPagingEnabled(boolean enabled) {
this.enabled = enabled;
}
}
dependencies {
compile "com.android.support:support-v4:+"
compile 'com.squareup.picasso:picasso:2.3.2'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.daimajia.slider:library:1.1.5@aar'
}
<!-- if you want to load images from the internet -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- if you want to load images from a file OR from the internet -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<com.daimajia.slider.library.SliderLayout
android:id="@+id/slider"
android:layout_width="match_parent"
android:layout_height="200dp"
/>
public class SlideShow extends Activity {
ImageView mIVmenu;
SliderLayout sliderLayout;
ListView menu_list;
ArrayList<String> imgList = new ArrayList<String>();
int position;
Button btnBack;
static int adapter_position = 0;
String animation_name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.slideshow);
sliderLayout = (SliderLayout) findViewById(R.id.sliderlayout);
menu_list = (ListView) findViewById(R.id.menu_list);
btnBack = (Button) findViewById(R.id.btn_back_slideshow);
menu_list.setAdapter(adapter);
// get Data from Intent array list and set on array list
imgList = getIntent().getStringArrayListExtra("arrayList");
position = getIntent().getExtras().getInt("position");
animation_name = SliderLayout.Transformer.Default.toString();
}
// call method for set images in slideshow and configure slideshow..
addImagesToSlider();
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(SlideShow.this, MainActivity.class);
startActivity(i);
finish();
}
});
}
private void addImagesToSlider() {
for (int i = 0; i < imgList.size(); i++) {
TextSliderView textSliderView = new TextSliderView(this);
textSliderView.description("").image(new File(imgList.get(i))).setScaleType(BaseSliderView.ScaleType.CenterInside).setOnSliderClickListener(new BaseSliderView.OnSliderClickListener() {
@Override
public void onSliderClick(BaseSliderView slider) {
}
});
sliderLayout.addSlider(textSliderView);
}
sliderLayout.setPresetTransformer(animation_name);
sliderLayout.setCustomAnimation(new DescriptionAnimation());
sliderLayout.stopAutoCycle();
sliderLayout.setCurrentPosition(position);
}
BaseAdapter adapter = new BaseAdapter() {
@Override
public int getCount() {
return SliderLayout.Transformer.values().length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view;
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.slidemenu_item, parent, false);
TextView tv = (TextView) view.findViewById(R.id.txtslideTitle);
final String str = SliderLayout.Transformer.values()[position].toString();
tv.setText(str);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sliderLayout.setPresetTransformer(str);
animation_name = str;
notifyDataSetChanged();
}
});
if (str.equals(animation_name)) {
adapter_position = position;
tv.setBackgroundColor(getResources().getColor(R.color.colorAccent));
} else { tv.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
}
return view;
}
};
}