Advertisement

Responsive Advertisement

Custom Slider View Configure In Android Studio

  •  Create this class in util package
    package com.prologic.innOnMackinac.slider;

    import android.content.Context;
    import android.os.Handler;
    import android.os.Looper;
    import android.os.Message;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.animation.Interpolator;

    import androidx.viewpager.widget.PagerAdapter;
    import androidx.viewpager.widget.ViewPager;

    import java.lang.ref.WeakReference;
    import java.lang.reflect.Field;

    public class SliderViewPager extends ViewPager {
    public static final int DEFAULT_INTERVAL = 1500;
    public static final int LEFT = 0;
    public static final int RIGHT = 1;
    public static final int SLIDE_BORDER_MODE_NONE = 0;
    public static final int SLIDE_BORDER_MODE_CYCLE = 1;
    public static final int SLIDE_BORDER_MODE_TO_PARENT = 2;
    private long interval = DEFAULT_INTERVAL;
    private int direction = RIGHT;
    private boolean isCycle = true;
    private boolean stopScrollWhenTouch = true;
    private int slideBorderMode = SLIDE_BORDER_MODE_NONE;
    private boolean isBorderAnimation = true;
    private double autoScrollFactor = 1.0;
    private double swipeScrollFactor = 1.0;
    private Handler handler;
    private boolean isAutoScroll = false;
    private boolean isStopByTouch = false;
    private float touchX = 0f, downX = 0f;
    private SliderScroller scroller = null;

    public static final int SCROLL_WHAT = 0;

    public SliderViewPager(Context paramContext) {
    super(paramContext);
    init();
    }

    public SliderViewPager(Context paramContext, AttributeSet paramAttributeSet) {
    super(paramContext, paramAttributeSet);
    init();
    }

    private void init() {
    handler = new ScrollHandler(this);
    setViewPagerScroller();
    }


    public void startAutoScroll() {
    isAutoScroll = true;
    sendScrollMessage((long) (interval + scroller.getDuration() / autoScrollFactor * swipeScrollFactor));
    }


    public void startAutoScroll(int delayTimeInMills) {
    isAutoScroll = true;
    sendScrollMessage(delayTimeInMills);
    }


    public void stopAutoScroll() {
    isAutoScroll = false;
    handler.removeMessages(SCROLL_WHAT);
    }


    public void setSwipeScrollDurationFactor(double scrollFactor) {
    swipeScrollFactor = scrollFactor;
    }


    public void setAutoScrollDurationFactor(double scrollFactor) {
    autoScrollFactor = scrollFactor;
    }

    private void sendScrollMessage(long delayTimeInMills) {

    handler.removeMessages(SCROLL_WHAT);
    handler.sendEmptyMessageDelayed(SCROLL_WHAT, delayTimeInMills);
    }

    private void setViewPagerScroller() {
    try {
    Field scrollerField = ViewPager.class.getDeclaredField("mScroller");
    scrollerField.setAccessible(true);
    Field field = ViewPager.class.getDeclaredField("sInterpolator");
    field.setAccessible(true);
    scroller = new SliderScroller(getContext(), (Interpolator) field.get(null));
    scrollerField.set(this, scroller);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }


    public void scrollOnce() {
    PagerAdapter adapter = getAdapter();
    int currentItem = getCurrentItem();
    int totalCount;
    if (adapter == null || (totalCount = adapter.getCount()) <= 1) {
    return;
    }
    int nextItem = (direction == LEFT) ? --currentItem : ++currentItem;
    if (nextItem < 0) {
    if (isCycle) {
    setCurrentItem(totalCount - 1, isBorderAnimation);
    }
    } else if (nextItem == totalCount) {
    if (isCycle) {
    setCurrentItem(0, isBorderAnimation);
    }
    } else {
    setCurrentItem(nextItem, true);
    }
    }


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    int action = ev.getActionMasked();

    if (stopScrollWhenTouch) {
    if ((action == MotionEvent.ACTION_DOWN) && isAutoScroll) {
    isStopByTouch = true;
    stopAutoScroll();
    } else if (ev.getAction() == MotionEvent.ACTION_UP && isStopByTouch) {
    startAutoScroll();
    }
    }

    if (slideBorderMode == SLIDE_BORDER_MODE_TO_PARENT || slideBorderMode == SLIDE_BORDER_MODE_CYCLE) {
    touchX = ev.getX();
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
    downX = touchX;
    getParent().requestDisallowInterceptTouchEvent(true);
    } else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
    // Calculate the difference in X coordinate
    float diffX = Math.abs(touchX - downX);
    // Check if the difference is greater than a certain threshold to allow parent to intercept touch events
    if (diffX > 20) {
    getParent().requestDisallowInterceptTouchEvent(false);
    }
    }
    }

    return super.dispatchTouchEvent(ev);
    }

    private static class ScrollHandler extends Handler {

    private final WeakReference<SliderViewPager> viewPager;

    public ScrollHandler(SliderViewPager viewPager) {
    super(Looper.getMainLooper());
    this.viewPager = new WeakReference<SliderViewPager>(viewPager);
    }

    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);
    if (msg.what == SCROLL_WHAT) {
    SliderViewPager pager = viewPager.get();
    if (pager != null) {
    pager.scroller.setScrollDurationFactor(pager.autoScrollFactor);
    pager.scrollOnce();
    pager.scroller.setScrollDurationFactor(pager.swipeScrollFactor);
    pager.sendScrollMessage(pager.interval + pager.scroller.getDuration());
    }
    }
    }
    }


    public long getInterval() {
    return interval;
    }

    public void setInterval(long interval) {
    this.interval = interval;
    }


    public int getDirection() {
    return (direction == LEFT) ? LEFT : RIGHT;
    }


    public void setDirection(int direction) {
    this.direction = direction;
    }


    public boolean isCycle() {
    return isCycle;
    }


    public void setCycle(boolean isCycle) {
    this.isCycle = isCycle;
    }


    public boolean isStopScrollWhenTouch() {
    return stopScrollWhenTouch;
    }


    public void setStopScrollWhenTouch(boolean stopScrollWhenTouch) {
    this.stopScrollWhenTouch = stopScrollWhenTouch;
    }


    public int getSlideBorderMode() {
    return slideBorderMode;
    }


    public void setSlideBorderMode(int slideBorderMode) {
    this.slideBorderMode = slideBorderMode;
    }


    public boolean isBorderAnimation() {
    return isBorderAnimation;
    }


    public void setBorderAnimation(boolean isBorderAnimation) {
    this.isBorderAnimation = isBorderAnimation;
    }

    }
  • Create HomeSlider class in adapter package


    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.FrameLayout
    import android.widget.LinearLayout
    import androidx.viewpager.widget.PagerAdapter
    import com.prologic.innOnMackinac.R
    import com.prologic.innOnMackinac.databinding.HomeSliderAdapterBinding
    import com.prologic.innOnMackinac.model.Slide1
    import com.prologic.innOnMackinac.utils.loadImage
    import java.util.*


    class HomeSlider : PagerAdapter() {
    var arrayList = ArrayList<Any>()
    private var clickListener: ((Any) -> Unit?)? = null

    fun setOnclickListener(clickListener: ((Any) -> Unit?)) {
    this.clickListener = clickListener
    }

    fun updateAdapter(arrayList: ArrayList<Any>) {
    this.arrayList = arrayList
    notifyDataSetChanged()
    }

    override fun getCount() = arrayList.size


    override fun isViewFromObject(view: View, `object`: Any): Boolean {
    return view === `object` as FrameLayout
    }


    override fun instantiateItem(container: ViewGroup, position: Int): Any {
    val inflater = LayoutInflater.from(container.context)
    val binding = HomeSliderAdapterBinding.inflate(inflater, container, false)
    val item = arrayList[position] as Slide1
    binding.title.text=item.title
    loadImage(binding.image, item.image, R.drawable.big_logo)
    container.addView(binding.root)
    binding.image.setOnClickListener {
    // Uncomment the code below and verify if it's triggering the click listener
    clickListener?.invoke(item)
    }
    return binding.root
    }



    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
    container.removeView(`object` as FrameLayout)
    }
    }

  • in your activity/Fragment file

    fun setSliderAdapter() {
    viewPager.pageMargin = resources.getDimensionPixelOffset(R.dimen._10sp)
    viewPager.adapter = model.sliderAdapter
    viewPager.startAutoScroll()
    viewPager.interval = 3000
    viewPager.isCycle = true
    viewPager.isStopScrollWhenTouch = true
    viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
    override fun onPageScrolled(
    position: Int, positionOffset: Float, positionOffsetPixels: Int
    ) {

    }

    override fun onPageSelected(position: Int) {
    model.indicatorAdapter.selected = position
    model.indicatorAdapter.updateAdapter()
    Log.d(TAG, "SliderPageSelected $position")
    }

    override fun onPageScrollStateChanged(state: Int) {

    }
    })

    }
    override fun onResume() {
    super.onResume()
    model.getSliderImage()
    viewPager.startAutoScroll()
    }

    override fun onPause() {
    super.onPause()
    stopAutoScroll()
    }

    fun stopAutoScroll() {
    viewPager.stopAutoScroll()
    }
    class HomeModel(application: Application) : AndroidViewModel(application) {
    
    val indicatorAdapter = HomeAdapter(this, 5)
    // this is the reference of homeadapter
    //here indicate adapter will show in which slider you are
    init {
    indicatorAdapter.selected = 0
    try {
    var json = sharedPreference.getString(SLIDER)
    if (json!!.isNotEmpty()) {
    val it: ArrayList<Slide1> =
    gson.fromJson(json, object : TypeToken<ArrayList<Slide1>>() {}.type)
    sliderAdapter.updateAdapter(it as ArrayList<Any>)
    indicatorAdapter.updateAdapter(it as ArrayList<Any>)
    }
    }
    } catch (_: Exception) {
    }
    }
    val sliderAdapter = HomeSlider()
    
    //here slidelist is data model class
    sliderAdapter.updateAdapter(slideList as ArrayList<Any>) 
    
    indicatorAdapter.updateAdapter(slideList as ArrayList<Any>)
    sharedPreference.putString(SLIDER, gson.toJson(slideList))
    //if you want to save it as json through sharedpreference
    }
  • in adapter you have to paster on inner holder class

    fun bindHolder(position: Int) {
    if (selected == position) {
    binding.image.setImageResource(R.drawable.selected_icon)
    } else {
    binding.image.setImageResource(R.drawable.slider_dot)
    }
  • your recyclerview will be if you'r using databinding

    <androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/framelayout"
    android:layout_width="match_parent"
    android:layout_height="@dimen/_140sp"
    android:layout_marginTop="@dimen/_2sp"
    >

    <com.google.android.material.imageview.ShapeableImageView
    android:id="@+id/sliderImage"
    android:layout_width="match_parent"
    android:layout_height="@dimen/_140sp"
    android:layout_marginHorizontal="@dimen/_16sp"
    android:background="@color/trans"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:shapeAppearance="@style/CornerSize5Percent" />

    <com.prologic.innOnMackinac.slider.SliderViewPager
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="@dimen/_140sp"
    android:clipToPadding="false"
    android:paddingLeft="@dimen/_16sp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:paddingRight="@dimen/_16sp" />
  • where style folder contains
    <style name="CornerSize5Percent">
    <item name="cornerSize">5%</item>
    </style>


Post a Comment

0 Comments