Android ViewPager实现滑动指示条功能

布局

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="48dp"
      tools:ignore="MissingConstraints" android:id="@+id/linearLayout">

    <TextView
        android:id="@+id/tv_one"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1.0"
        android:gravity="center"
        android:text="黄色"
        android:textColor="#000000"/>

    <TextView
        android:id="@+id/tv_two"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1.0"
        android:gravity="center"
        android:text="红色"
        android:textColor="#000000"/>

    <TextView
        android:id="@+id/tv_three"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1.0"
        android:gravity="center"
        android:text="绿色"
        android:textColor="#000000"/>
  </LinearLayout>

  <ImageView
      android:id="@+id/img_cursor"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:scaleType="matrix"
      android:src="@mipmap/line"
      />

  <android.support.v4.view.ViewPager
      android:id="@+id/vp_show"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center" tools:ignore="MissingConstraints"/>

</LinearLayout>

view1.xml view2.xml… 基本相同

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:background="@color/colorAccent"
       android:layout_height="match_parent">
  <View
      android:id="@+id/vp_text"
      android:text="page 2"

      android:layout_width="match_parent"
      android:layout_height="match_parent" />

</LinearLayout>

素材line.png

注意,由于api版本不同,android.support.v4.view.ViewPager可能报错,
更换为androidx.viewpager.widget.ViewPager

java代码

MyPagerAdapter类

package com.demo;

import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;

public class MyPagerAdapter extends PagerAdapter {

  private ArrayList<View> viewLists;

  public MyPagerAdapter() {
  }

  public MyPagerAdapter(ArrayList<View> viewLists) {
    this.viewLists = viewLists;
  }

  @Override
  public int getCount() {
    return viewLists.size();
  }

  @Override
  public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
    return view==o;
  }

  @NonNull
  @Override
  public Object instantiateItem(@NonNull ViewGroup container, int position) {

    container.addView(viewLists.get(position));
    return viewLists.get(position);
  }

  @Override
  public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    container.removeView(viewLists.get(position));
  }
}

MainActivity类

package com.demo;

import android.annotation.SuppressLint;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements View.OnClickListener,
    ViewPager.OnPageChangeListener{

  private ViewPager pager1;
  private ArrayList<View> list;
  private MyPagerAdapter myPagerAdapter;

  private ImageView img_cursor;
  private TextView tv_one;
  private TextView tv_two;
  private TextView tv_three;
  private int offSet = 0; //移动条图片的偏移量
  private int currIndex = 0; //当前页
  private int imageWidth = 0; //移动条图片的宽度
  private int one = 0;  //移动条滑动一页的距离
  private int two = 0;  //移动条滑动两页的距离

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    init();

  }

  private void init() {
    tv_one = findViewById(R.id.tv_one);
    tv_two = findViewById(R.id.tv_two);
    tv_three = findViewById(R.id.tv_three);
    img_cursor =findViewById(R.id.img_cursor);

    /**
     * 下划线动画的相关设置
     */
    //获取图片的宽度
    imageWidth = BitmapFactory.decodeResource(getResources(),R.mipmap.line).getWidth();

    DisplayMetrics dm = new DisplayMetrics();
    //获取手机屏幕宽度
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    int screenW = dm.widthPixels;
    offSet = (screenW/3 - imageWidth) /2 ; //计算偏移量

    Matrix matrix = new Matrix();
    matrix.postTranslate(offSet,0);

    img_cursor.setImageMatrix(matrix);//设置动画初始位置

    one = offSet *2 +imageWidth;
    two = one*2;

    pager1 = findViewById(R.id.vp_show);

    //往ViewPager填充View,同时设置点击事件与页面切换事件
    list = new ArrayList<>();
    LayoutInflater li = getLayoutInflater();

    list.add(li.inflate(R.layout.view3,null,false));
    list.add(li.inflate(R.layout.view1,null,false));
    list.add(li.inflate(R.layout.view2,null,false));

    myPagerAdapter= new MyPagerAdapter(list);
    pager1.setAdapter(myPagerAdapter);
    pager1.setCurrentItem(0);     //设置ViewPager当前页,从0开始算

    tv_one.setOnClickListener(this);
    tv_two.setOnClickListener(this);
    tv_three.setOnClickListener(this);

    pager1.addOnPageChangeListener(this);

  }

  @Override
  public void onPageScrolled(int i, float v, int i1) {

  }

  @Override
  public void onPageSelected(int i) {
    Animation animation = null;
    switch (i){

      case 0:
        if (currIndex==1) {
          animation = new TranslateAnimation(one,0,0,0);
        }
        else if (currIndex==2) {
          animation = new TranslateAnimation(two,0,0,0);
        }
        break;
      case 1:
        if (currIndex==0) {
          animation = new TranslateAnimation(offSet,one,0,0);
        }
        else if (currIndex==2) {
          animation = new TranslateAnimation(two,one,0,0);
        }
        break;
      case 2:
        if (currIndex==1) {
          animation = new TranslateAnimation(one,two,0,0);
        }
        else if (currIndex==0) {
          animation = new TranslateAnimation(offSet,two,0,0);
        }
        break;
    }

    currIndex = i;
    animation.setFillAfter(true); // true表示图片停在动画结束位置
    animation.setDuration(300); //设置动画时间
    img_cursor.startAnimation(animation); //开始动画

  }

  @Override
  public void onPageScrollStateChanged(int i) {

  }

  @Override
  public void onClick(View view) {

    switch (view.getId()) {
      case R.id.tv_one: pager1.setCurrentItem(0);break;
      case R.id.tv_two: pager1.setCurrentItem(1);break;
      case R.id.tv_three: pager1.setCurrentItem(2);break;
    }

  }
}

效果

到此这篇关于Android ViewPager实现滑动指示条功能的文章就介绍到这了,更多相关Android滑动指示条内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android自定义ViewPager实现纵向滑动翻页效果

    抖音几乎已经成为了我们日常生活中使用比较频繁的App,无聊之时或工作之后可以刷一刷短视频来供我们娱乐与放松.看到抖音的视屏切换效果,觉得用ViewPager可以做出一样的效果.想一想之前用的ViewPager都是横向切换的,虽然很经常用,但是从来没实现过竖向的切换效果,说做就做吧. 我们先看一波效果图: 那么,要想实现这样的效果,当然是自定义ViewPager啦.问了一下度娘,看到有这样一种思路: 首先,把Touch事件的x,y坐标做一下交换,从原先的x坐标差值转变成y坐标的差值,正符合了我们手

  • Android中ViewPager实现滑动指示条及与Fragment的配合

    自主实现滑动指示条 先上效果图: 1.XML布局 布局代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match

  • Android使用viewpager实现自动无限轮播图

    1.具体步骤 说下大概实现步骤,一般我们有两种,一种是viewpager+作为游标的点 .另外一种是重写viewpager. 效果图: 1.1 布局,直接viewpager+一个viewgroup就好. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:

  • Android ViewPager实现滑动指示条功能

    布局 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="

  • android ViewPager实现滑动翻页效果实例代码

    实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下: import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.View; public class ReadViewPager extends ViewPager { public ReadV

  • Android中ViewPager实现滑动条及与Fragment结合的实例教程

    自主实现滑动指示条 先上一个基本效果图: 1.XML布局 布局代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="m

  • Android ViewPager实现左右滑动的实例

    Android ViewPager实现左右滑动的实例 多个标题以及标题下的每个View视图 <com.shizhefei.view.indicator.ScrollIndicatorView android:id="@+id/moretab_indicator" android:layout_width="match_parent" android:layout_height="45dp" /> <View android:la

  • Android ViewPager撤消左右滑动切换功能实现代码

    最近做项目要求某种情况下ViewPager不能滑动,那么我们只需要重写这个方法就可以禁止ViewPager滑动.下面通过本文给大家ViewPager取消左右滑动切换功能的实例代码,具体代码如下所示: IndexViewPager.Java: <span style="background-color: rgb(255, 255, 255);">import android.content.Context; import android.support.v4.view.Vie

  • Android解决viewpager嵌套滑动冲突并保留侧滑菜单功能

    重写子pagerview的dispatchTouchEvent方法,在返回前添加一句getParent().requestDisallowInterceptTouchEvent(true)中断掉事件的传递,类如下 public class SupperViewPager extends ViewPager { private int screenWidth;//屏幕宽度 public SupperViewPager(Context context) { super(context); } pub

  • Android App中使用ViewPager实现滑动分页的要点解析

    以前如果要做 Tab 分页的话,必须要用一个很难用的 TabActivity,而且做出来的效果很差,弹性也很小 忘了从什么时候开始,Google release 了 ViewPager 这好东西取代了以前难用的 Gallery 元件,加上从 Honeycomb 导入的 Fragment 之后终于能够简单做出好看又好用的 Layout 了! 这里我们采用PagerTabStrip ,做出来的效果如下 特色就是使用简单,出来的效果则是目前显示的分页 Tab 的文字会自动置中,然后分别在左右显示上一个

  • Android编程实现的简易路径导航条功能示例

    本文实例讲述了Android编程实现的简易路径导航条功能.分享给大家供大家参考,具体如下: 这里要实现的是如图所示的路径导航条, 类似于文件管理器的效果. 该导航条包含三个功能: 1. 支持追加任意个子路径(文字一行写不下时可左右滑动): 2. 支持返回到上一个路径: 3. 支持点击中间的某个路径回到指定位置. 代码很简单,已封装成自定义View, 如下: PathTextView.Java /** * 显示路径的View,支持返回上一级,支持点击某个位置回到指定层级. */ public cl

  • Android开发中滑动分页功能实例详解

    本文实例讲述了Android开发中滑动分页功能.分享给大家供大家参考,具体如下: android UI 往右滑动,滑动到最后一页就自动加载数据并显示 如图: Java代码: package cn.anycall.ju; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import andro

随机推荐