2016-04-11 8 views
10

私は、カルーセルのように動作する私のCustomViewPagerの開始時にアニメーションを作成するのに成功しました。そこでここでは、私のアイテムは左から来て、3秒で右に行く。私のビューページを遠くから最終的な位置にスクロールさせることが可能かどうか疑問に思っていただけの翻訳です。起動時にアニメーションを起動するCustomViewPager

これを行う方法がありますか?よろしくです。 よろしくお願いします。

編集:私は別のものを試してみました。自分のカスタムScrollToAnimationを作成しました。私は自分が望むものを作り出すことに成功しますが、動きがスムーズではないので、私を助けてくれます。私の新しいコード:

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); 
    } 
} 

EDIT2:ここ

のスクリーンショットは、あなたは私が欲しいものを理解するのに役立ちます。実は私はこのようなカスタムviewpagerを持っている:

enter image description here

私が欲しいアニメーションがフォローです:

  • 私はアニメーションにアイテムを起動すると遠く離れています。
  • その後、左から右(またはその反対)から来て選択したアイテムに止まりますが、アイテムがスクロールしているときにスケール効果を持たせたいとします。私は感謝私の問題

カスタムアダプタにスケーリング効果を作成するために、成功
  • は、ここで私はそれがスムーズではありません、現在の項目を設定するとき、あなたがどんな考えを持っていますでしょうか?ここにコードアダプターがあります

    さらに簡単な方法として、現在のアイテムの現在の位置をすべて更新せずに変更することは可能でしょうか?あなたが見ることができるように私は既に翻訳を持っているので、私は現在のアイテムを設定するとオフセットとスクロールの間に矛盾が生じてしまいますので、

  • +1

    質問を詳しくお書きください。あなたが本当に立ち往生した場所を理解することは難しい –

    +1

    私は私の現在のアニメーションを改善したい。ここで私のアニメーションは右から左への翻訳です。あたかも指でスクロールしているかのように滑らかなスクロールをしたい。たとえば、私がViewPagerクラスからscollToメソッドを使用していた場合、それがまだ不明な場合はごめんなさいと同じ結果を使用できるようにしたいと考えています。 – zed13

    +1

    @ zed13:「私のビューページをスクロールして遠くから最終的な位置にスクロールさせることが可能かどうか疑問に思っていました。これは翻訳のようにも聞こえます。通常scrollToは翻訳のみを行います。しかし、あなたが達成しようとしているもののビデオを投稿することができれば、それはより簡単になります(ViewPagerが翻訳アニメーションのみを作成することを見た限り)。 –

    答えて

    1

    スムーズなView Pagerを使用しようとすると、速度を設定できます。あなたが必要とするのは、それを0の位置に設定し、それを目に見えるようにして目標の位置に移動させ、スムーズにターゲットにスクロールさせ、必要に応じて共通ビューのページャのようにアニメーションを適用するだけです。また、あなたはfalse、ユーザーへのsetPagingEnableは、タッチ

    私はあなたが真実のスクロールやアニメーションで画像変化とimageSliderのものを作るために持っていると思う
    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; 
        } 
    } 
    
    +1

    スクロールスクロール(SpeedScroller)が既にあるので、setCurrentItem()メソッドのおかげで現在選択されている項目を変更しようとしているが、同時にscrollToメソッドを使用しているため問題が表示されます。だからなぜ私はsetCurrentItem()を使用するのですか? ViewPagerが私のアダプタからonPageScrolled()メソッドを呼び出したのと同時に、ビューページがスクロールしているのと同じです。 – zed13

    3

    ことによってそれをスクロールしないであろうことがあります。

    Android Image Sliderライブラリはgithubで利用できるようになりました。

    • ステップ1:以下のコンパイル時のグラデーション。

      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:[email protected]' 
      } 
      
    • ステップ2:あなたのAndroidManifestに権限(必要な場合)を追加します。XML

      <!-- 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" /> 
      
    • ステップ3:あなたのレイアウトにスライダーを追加します。

      <com.daimajia.slider.library.SliderLayout 
      android:id="@+id/slider" 
      android:layout_width="match_parent" 
      android:layout_height="200dp" 
      /> 
      

      今すぐあなたのActivityここSlideShow.classマネージコード内でコードを作成します。

    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; 
    } 
        }; 
    } 
    
    そして、より多くの情報、私はいくつかのイントロスペクションのおかげで進行する成功this

    0

    参照してください。私は、ViewPagerクラスのpageScrolledメソッドを呼び出しました。

    関連する問題