iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ScrollView与SeekBar绑定如何实现滑动时出现小滑块效果
  • 791
分享到

ScrollView与SeekBar绑定如何实现滑动时出现小滑块效果

scrollviewseekbar滑动 2023-05-30 20:05:49 791人浏览 独家记忆
摘要

这篇文章主要介绍ScrollView与SeekBar绑定如何实现滑动时出现小滑块效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!重写SeekBarpublic class VerticalSee

这篇文章主要介绍ScrollView与SeekBar绑定如何实现滑动时出现小滑块效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

重写SeekBar

public class VerticalSeekbar extends SeekBar {  public VerticalSeekbar(Context context) {    super(context);  }  public VerticalSeekbar(Context context, AttributeSet attrs, int defStyle) {    super(context, attrs, defStyle);  }  public VerticalSeekbar(Context context, AttributeSet attrs) {    super(context, attrs);  }  protected void onSizeChanged(int w, int h, int oldw, int oldh) {    super.onSizeChanged(h, w, oldh, oldw);  }  @Override  public synchronized void setProgress(int progress) // it is necessary for calling setProgress on click of a button  {    super.setProgress(progress);    onSizeChanged(getWidth(), getHeight(), 0, 0);  }  @Override  protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(heightMeasureSpec, widthMeasureSpec);    setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());  }  protected void onDraw(canvas c) {      c.rotate(90);//旋转    c.translate(0, -getWidth());//旋转,这两行不可去掉    super.onDraw(c);  }  @Override  public boolean onTouchEvent(MotionEvent event) {    if (!isEnabled()) {      return false;    }    switch (event.getAction()) {      case MotionEvent.ACTION_DOWN:      case MotionEvent.ACTION_MOVE:      case MotionEvent.ACTION_UP:      setProgress((int) (getMax() * event.getY() / getHeight()));        onSizeChanged(getWidth(), getHeight(), 0, 0);        break;   case MotionEvent.ACTION_CANCEL:        break;    }    return true;  }}

重写SccrollView

public class ObservableScrollView extends ScrollView {  public ScrollViewListener scrollViewListener = null;  public ObservableScrollView (Context context) {    super(context);  }  public ObservableScrollView (Context context, AttributeSet attrs,                 int defStyle) {    super(context, attrs, defStyle);  }  public interface ScrollViewListener {    void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);  }  public ObservableScrollView (Context context, AttributeSet attrs) {    super(context, attrs);  }  public void setScrollViewListener(ScrollViewListener scrollViewListener) {    this.scrollViewListener = scrollViewListener;  }  @Override  public void onScrollChanged(int x, int y, int oldx, int oldy) {    super.onScrollChanged(x, y, oldx, oldy);    if (scrollViewListener != null) {      scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);    }  }}

主工程

public class Slider_Text extends Activity {  private TextView textView;  private Context context=this;  private Scroller scroller;  private ScrollBindHelper scrollBindHelper;  private VerticalSeekbar seekBar;  private ObservableScrollView scrollView;  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_slider__text);    scroller=new Scroller(context);    textView=(TextView)findViewById(R.id.text);    textView.setText("也许是在用这种方式告诉我,分开了就不要怀抱希望,现实,梦中都不能。\n" +        "\n" +        "  了,那些无处安放的情感就让它各自归位,你别来,");     seekBar = (VerticalSeekbar) findViewById(R.id.seekbar);     scrollView = (ObservableScrollView) findViewById(R.id.scrollView);    scrollBindHelper=new ScrollBindHelper(seekBar,scrollView);    scrollBindHelper.bind(seekBar,scrollView);    scrollView.setOnTouchListener(new View.OnTouchListener() {      private int lastY = 0;      private int touchEventId = -9983761;      Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {          super.handleMessage(msg);          View scroller = (View) msg.obj;          if (msg.what == touchEventId) {            if (lastY == scroller.getScrollY()) {              handleStop(scroller);            } else {              handler.sendMessageDelayed(handler.obtainMessage(touchEventId, scroller), 5);              lastY = scroller.getScrollY();            }          }        }      };      public boolean onTouch(View v, MotionEvent event) {        if (event.getAction() == MotionEvent.ACTION_UP) {          handler.sendMessageDelayed(handler.obtainMessage(touchEventId, v), 5);        }        return false;      }      //处理真正的事件      private void handleStop(Object view) {        ScrollView scroller = (ScrollView) view;        int scrollY = scroller.getScrollY();        System.out.println("scrollY"+scrollY);        seekBar.setVisibility(View.GoNE);//滑动停止后,自动隐藏seekbar      }    });  }}

主布局

<LinearLayout xmlns:Android="Http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="horizontal"  tools:context="io.dcloud.H5B79C397.testActivity.Slider_Text">  <io.dcloud.H5B79C397.view.ObservableScrollView    android:id="@+id/scrollView"    android:layout_width="0dp"    android:layout_height="match_parent"    android:layout_weight="15">    <TextView      android:id="@+id/text"      android:layout_width="match_parent"      android:layout_height="wrap_content"      android:text="asdfasdfasdfff" />  </io.dcloud.H5B79C397.view.ObservableScrollView >  <io.dcloud.H5B79C397.view.VerticalSeekbar    android:id="@+id/seekbar"    android:layout_width="0dp"    android:visibility="gone"    android:layout_height="match_parent"    android:layout_weight="1"    android:progressDrawable="@drawable/seek"    android:thumbTint="@color/green" /></LinearLayout>

SeekBar样式

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">  <item android:id="@android:id/background">    <shape>      <corners android:radius="5dp"/>      <solid android:color="#FFFFFF"/>    </shape>  </item>  <item android:id="@android:id/secondaryProgress">    <clip>      <shape>        <corners android:radius="5dp"/>        <solid android:color="#FFFFFF"/>      </shape>    </clip>  </item>  <item android:id="@android:id/progress">    <clip>      <shape>        <corners android:radius="5dp"/>        <solid android:color="#FFFFFF" />      </shape>    </clip>  </item></layer-list>

绑定SeekBar和ScrollView

public class ScrollBindHelper implements SeekBar.OnSeekBarChangeListener,ObservableScrollView.ScrollViewListener{  private final VerticalSeekbar seekBar;  private final ObservableScrollView scrollView;  private final View scrollContent;    public ScrollBindHelper(VerticalSeekbar seekBar, ObservableScrollView scrollView) {    this.seekBar = seekBar;    this.scrollView = scrollView;    this.scrollContent = scrollView.getChildAt(0);    // System.out.println("scrollContent------->"+scrollView.getChildAt(0));  }    private boolean isUserSeeking;  private int getContentRange() {    seekBar.setMax(scrollContent.getHeight() - scrollView.getHeight());    int Range=scrollView.getScrollY();    //System.out.println("content----->"+Range);    return Range;  }  private int getScrollRange() {    System.out.println(scrollContent.getHeight() - scrollView.getHeight());    return scrollContent.getHeight() - scrollView.getHeight();}  public ScrollBindHelper bind(VerticalSeekbar seekBar, ObservableScrollView scrollView) {    //初始化工具类    ViewUtil.init(seekBar.getContext().getApplicationContext());    ScrollBindHelper helper = new ScrollBindHelper(seekBar, scrollView);    seekBar.setOnSeekBarChangeListener(helper);    scrollView.setScrollViewListener(helper);    return helper;  }@Override  public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {    //当不是用户操作,也就是ScrollView的滚动隐射过来时不执行操作    if (!fromUser) {      // seekBar.setProgress();      //将拖动的换百分比算成Y值,并映射到SrollView上。      int range=getContentRange();      scrollView.scrollTo(0, progress);     //  System.out.println("scroll----"+progress);    }}  @Override  public void onStartTrackingTouch(SeekBar seekBar) {    isUserSeeking = true;    handler.clearAll();  }  @Override  public void onStopTrackingTouch(SeekBar seekBar) {    isUserSeeking = false;    handler.reset();  }    public static final long DEFAULT_TIME_OUT = 10L;  @Override  public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {    showScroll();    //用户拖动SeekBar时不触发ScrollView的回调    if (isUserSeeking) {      return;    }    //计算当前滑动位置相对于整个范围的百分比,并映射到SeekBar上    int range = getContentRange();    seekBar.setProgress(range != 0 ? range : 0);    //System.out.println("seekBar------"+ range);  }  private static class VisibleHandler extends LastMsgHandler {    private ScrollBindHelper helper;    public VisibleHandler(ScrollBindHelper helper) {      this.helper = helper;    }    public void reset() {      sendMsgDelayed(DEFAULT_TIME_OUT);    }    @Override    protected void handleLastMessage(Message msg) {      helper.hideScroll();    }  }  private VisibleHandler handler = new VisibleHandler(this);  private void hideScroll() {    seekBar.setVisibility(View.GONE);  }  private void showScroll() {    seekBar.setVisibility(View.VISIBLE);  }}

工具类

public class ViewUtil {  private ViewUtil() {  }    private static float density;  private static float scaledDensity;  private static int widthPixels;  private static int heightPixels;  private static boolean isInit = false;  private static void confirmInit() {    if (!isInit) {      throw new IllegalStateException("ViewUtil还未初始化");    }  }  public static void init(Context context) {    if (isInit) {      return;    }    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();    density = displayMetrics.density;    scaledDensity = displayMetrics.scaledDensity;    widthPixels = displayMetrics.widthPixels;    heightPixels = displayMetrics.heightPixels;    isInit = true;  }  public static float getDisplayMetricsDensity() {    confirmInit();    return density;  }  public static float getDisplayMetriCSScaledDensity() {    confirmInit();    return scaledDensity;  }  public static int getScreenWidthPx() {    confirmInit();    return widthPixels;  }  public static int getScreenHeightPx() {    confirmInit();    return heightPixels;  }    public static int dpToPx(float dpValue) {    confirmInit();    return (int) (dpValue * getDisplayMetricsDensity() + 0.5F);  }  public static int pxToDp(float pxValue) {    confirmInit();    return (int) (pxValue / getDisplayMetricsDensity() + 0.5F);  }  public static int pxToSp(float pxValue) {    confirmInit();    return (int) (pxValue / getDisplayMetricsScaledDensity() + 0.5f);  }  public static int spToPx(float spValue) {    confirmInit();    return (int) (spValue * getDisplayMetricsScaledDensity() + 0.5f);  }}

线程工具

public abstract class LastMsgHandler extends android.os.Handler {  private int count = 0;    public synchronized final void increaseCount() {    count++;  }  public final void sendMsg() {    sendMsgDelayed(0);  }  public final void sendMsgDelayed(long delay) {    increaseCount();    if (delay <= 0) {      sendEmptyMessage(0);    } else {      sendEmptyMessageDelayed(0, delay);    }  }  public synchronized final void clearAll() {    count = 0;    removeCallbacksAndMessages(null);  }  @Override  public synchronized final void handleMessage(Message msg) {    super.handleMessage(msg);    count--;    if (count < 0) {      throw new IllegalStateException("count数异常");    }    if (count == 0) {      handleLastMessage(msg);    }  }    protected abstract void handleLastMessage(Message msg);}

上图

ScrollView与SeekBar绑定如何实现滑动时出现小滑块效果

跟着屏幕的滑动右边的小点会跟着滑动,点击滑动右边的小点可以控制屏幕的滑动,屏幕滑动结束后,小点自动隐藏。

以上是“ScrollView与SeekBar绑定如何实现滑动时出现小滑块效果”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: ScrollView与SeekBar绑定如何实现滑动时出现小滑块效果

本文链接: https://www.lsjlt.com/news/220818.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ScrollView与SeekBar绑定如何实现滑动时出现小滑块效果
    这篇文章主要介绍ScrollView与SeekBar绑定如何实现滑动时出现小滑块效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!重写SeekBarpublic class VerticalSee...
    99+
    2023-05-30
    scrollview seekbar 滑动
  • Unity ScrollView如何实现无限滑动效果
    小编给大家分享一下Unity ScrollView如何实现无限滑动效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、效果演示二、前言当邮件中有1000封邮件,...
    99+
    2023-06-20
  • Unity ScrollView实现无限滑动效果
    本文实例为大家分享了Unity ScrollView实现无限滑动效果的具体代码,供大家参考,具体内容如下 一、效果演示 二、前言 当邮件中有1000封邮件,商店列表中有1000个物...
    99+
    2024-04-02
  • 小程序实现滑动块效果
    本文实例为大家分享了小程序实现滑动块效果的具体代码,供大家参考,具体内容如下 当你在复制的时候 一定要 把js 逻辑的 list 数据更改就行了 小程序的css样式 .box {...
    99+
    2024-04-02
  • Angular.js如何通过自定义指令directive实现滑块滑动效果
    这篇文章主要介绍Angular.js如何通过自定义指令directive实现滑块滑动效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!方法如下1.下面是我html部分代码,detai...
    99+
    2024-04-02
  • js实现拖动滑块效果
    本文实例为大家分享了js如何拖动滑块的具体代码,供大家参考,具体内容如下 实现拖动滑块,先分析,滑块可以拖动应该改变滑块在页面中的坐标,那就采用定位拿到元素的 top 和 left ...
    99+
    2024-04-02
  • react如何实现滑动效果
    今天小编给大家分享一下react如何实现滑动效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。react实现滑动的方法:1、...
    99+
    2023-07-04
  • Android如何实现View滑动效果
    这篇文章给大家分享的是有关Android如何实现View滑动效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、View的滑动简介View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到...
    99+
    2023-06-14
  • vue实现小球滑动交叉效果
    本文实例为大家分享了vue实现小球滑动交叉效果的具体代码,供大家参考,具体内容如下 废话不多说 直接上代码! <template> <div class="...
    99+
    2024-04-02
  • Android如何自定View实现滑动验证效果
    本篇内容主要讲解“Android如何自定View实现滑动验证效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android如何自定View实现滑动验证效果”吧!效果图自定义属性代码<xm...
    99+
    2023-06-22
  • Android view如何实现滑动悬浮固定效果
    这篇文章主要介绍了Android view如何实现滑动悬浮固定效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.背景在项目开发过程中,有时候会碰到这样的需求:在滑动的过程...
    99+
    2023-05-30
    android
  • HTML5如何实现自带进度条和滑块滑杆效果
    小编给大家分享一下HTML5如何实现自带进度条和滑块滑杆效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、H5自带进度条 <div id="d"> &nbs...
    99+
    2023-06-09
  • iOS如何实现背景滑动效果
    这篇文章主要介绍了iOS如何实现背景滑动效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下第一步、在很多APP中,我们都可以看见那些特效绚丽的滑动选项条,那么如何...
    99+
    2023-06-29
  • Android如何实现平滑翻动效果
    这篇文章给大家分享的是有关Android如何实现平滑翻动效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下效果activity加implementsimplements GestureDet...
    99+
    2023-06-14
  • jQuery如何实现图片滑动效果
    这篇文章主要为大家展示了“jQuery如何实现图片滑动效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery如何实现图片滑动效果”这篇文章吧。思路:当鼠...
    99+
    2024-04-02
  • 怎么在小程序中实现一个滑动块效果
    这期内容当中小编将会给大家带来有关怎么在小程序中实现一个滑动块效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。小程序的css样式.box {    wi...
    99+
    2023-06-14
  • vue+jquery+lodash如何实现滑动时顶部悬浮固定效果
    这篇文章给大家分享的是有关vue+jquery+lodash如何实现滑动时顶部悬浮固定效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这个效果是一个项目中抽出来的一个demo效...
    99+
    2024-04-02
  • 怎么在Android中使用SeekBar实现一个平滑滚动效果
    这篇文章将为大家详细讲解有关怎么在Android中使用SeekBar实现一个平滑滚动效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。把max改为100,progress改为50<Se...
    99+
    2023-06-14
  • vue+Ant Design进度条滑块与input联动效果实现
     需求:滑块进度与输入框为一致,默认值为80,最小不能小于30,最大为100  子组件: <template> <div class="p...
    99+
    2022-12-08
    vue Ant Design进度条滑块 Ant Design进度条滑块与input联动 ant-design-vue 动态添加input  Ant Design进度条联动
  • 如何用CSS实现平滑滚动效果
    如何用CSS实现平滑滚动效果在网页设计与开发中,滚动效果是一种非常常见且炫酷的效果,能够为用户带来更好的体验。而实现平滑滚动效果,可以通过CSS的一些技巧来实现。本文将介绍如何使用CSS来实现平滑滚动效果,并提供具体的代码示例。一、使用锚点...
    99+
    2023-11-21
    平滑 CSS 滚动效果
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作