Je réussis à créer une animation au début de mon personnalisévalisseur qui agit comme un carrousel. Alors, ici, mes articles sont venus de la gauche et vont à droite en 3 secondes. La chose est que c'est juste une traduction que je me demandais s'il est possible de faire défiler mon point de vie de loin à sa position finale.
Voyez-vous un moyen de faire cela? Cordialement. P>
Edit: Alors j'essaye quelque chose d'autre et j'ai créé ma défilation personnaliséeToantimation. Je réussis à créer ce que je veux, mais le mouvement n'est pas lisse pouvez-vous m'aider. Mon nouveau code: p> l'espace de vue: p> edit2: p> ici une capture d'écran à vous aider à comprendre ce que je veux. En fait, j'ai un point de vue personnalisé comme ceci: p> L'animation que je veux est la suivante: p> Mon problème, voici quand je définirai l'élément actuel, il n'est pas lisse, avez-vous une idée? Voici l'adaptateur de code P>
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;
}
}
3 Réponses :
Essayez d'utiliser le téléavertisseur de vue en mode Smooth, vous pouvez configurer sa vitesse. Tout ce dont vous avez besoin est de le définir à 0 position, puis de le rendre visible, puis de le déplacer en position cible, il fera défiler sans heurts à la cible, vous pouvez appliquer n'importe quelle animation comme dans le téléavertisseur commun si vous le souhaitez. De plus, vous pouvez SetPagingenable CODE> TO
FALSE code> et l'utilisateur ne le fera pas défiler par Touch
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;
}
}
J'ai déjà un défileur lisse (Speedscroller), le problème apparaît parce que j'essaie de modifier l'élément sélectionné actuel grâce à la méthode SetCurrentItem (), mais j'utilise en même temps la méthode Scrollto. Alors pourquoi j'utilise le SetCurrentItem ()? Parce que je veux que le point de vue a appelé la méthode Onpagescrolled () de mon adaptateur en même temps que le visionneur est défilant.
Bibliothèque de curseur d'image Android disponible dans GitHub Voir ci-dessous l'étape pour l'utiliser. P> Étape 1: gradle à compiler sous Lib. p>
Étape 2: Ajouter des autorisations (si nécessaire) sur votre AndroidManifest.xml P>
Étape 3: Ajoutez le curseur à votre mise en page: P>
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;
}
};
}
Je réussis à progresser grâce à une introspection. J'ai appelé la méthode pagescrolled de la classe ViewPager. P>
S'il vous plaît élaborer sur votre question. Il est difficile de comprendre où vous êtes vraiment coincé
Je veux améliorer mon animation actuelle. Ici, mon animation n'est qu'une traduction du droit à gauche. Je veux avoir un défilement lisse comme si je fais défiler le visionneur de vie grâce à mon doigt. Par exemple, je souhaite pouvoir utiliser le même résultat que si j'avais l'aide de la méthode de Scollto à partir de la classe ViewPager, désolé si cela n'est toujours pas clair.
@ ZED13: "Je me demandais s'il est possible de faire défiler mon visionneur de vie de loin à sa dernière position." Cela ressemble également à une traduction. Habituellement, Scrollto ne fait que la traduction. Mais si vous pouvez poster une vidéo de ce que vous essayez de réaliser, cela sera plus facile (autant que je sait que je voyais que le lieu de vie ne fait que l'animation de la traduction).
Voulez-vous que votre compagnie faites défiler automatiquement ?? avec animation ?? @ zed13
J'ai mis à jour mon message.