seekBar实现滑动解锁[通俗易懂]

seekBar实现滑动解锁[通俗易懂]今天android项目里突然要做一个滑动解锁的控件,nm,ui出图就喜欢按照IOS上的控件来,这次也不例外,不过IOS上的滑动解锁效果确实还是不错。好了,废话不多说,上代码。

大家好,又见面了,我是你们的朋友全栈君。

今天android项目里突然要做一个滑动解锁的控件,nm,ui出图就喜欢按照IOS上的控件来,这次也不例外,不过IOS上的滑动解锁效果确实还是不错。好了,废话不多说,上代码。。。
关键的View代码SlidingSeekBar.java
/**
 * 描述:自定义滑动解锁(横向的)seekBar
 * 特点:自定义后seekBar只能滑动并禁用点击
 * 最关键的就是设置flag
 * Created by ruihe on 2016/5/28.
 */
public class SlidingSeekBar extends SeekBar implements SeekBar.OnSeekBarChangeListener, View.OnTouchListener {

    private Context mContext;
    /**
     * seekBar是否滑动的判断标志,默认为false
     */
    private boolean isSlide;
    /**
     * 每次手指按下时处在屏幕上的横坐标
     */
    private int mStartTouchX;
    /**
     * seekBar的状态监听
     */
    private OnSeekBarStatusListener mOnSeekBarStatusListener;
    private SlidingSeekBar mSlideSeekBar;
    private TextView tvHint;
    private View viewBg;
    private int[] mLocation = new int[2];

    public SlidingSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public SlidingSeekBar(Context context) {
        super(context);
    }

    public SlidingSeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void initSlideToRightUnlock(Context context, TextView tvHint, View v, OnSeekBarStatusListener onSeekBarStatusListener) {
        mSlideSeekBar = this;
        this.mContext = context;
        this.tvHint = tvHint;
        this.viewBg = v;
        this.mOnSeekBarStatusListener = onSeekBarStatusListener;
        mSlideSeekBar.setProgress(0);
        viewBg.setAlpha(0.0f);
        tvHint.setAlpha(1.0f);
        setOnTouchListener(this);
        setOnSeekBarChangeListener(this);
    }


    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (!fromUser)
            return;

        if (!isSlide) {
            seekBar.setProgress(0);
        } else {
            seekBar.setProgress(progress);
            float tempProgress = progress * 0.01f;
            viewBg.setAlpha(tempProgress);
            tvHint.setAlpha(1.0f - tempProgress * 2.0f);
        }

    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

        if (seekBar.getProgress() < 80) {//判断小于80的不算unlock操作
            seekBar.setProgress(0);
            tvHint.setAlpha(1.0f);
            viewBg.setAlpha(0.0f);
        } else {
            seekBar.setProgress(100);
            tvHint.setAlpha(0.0f);
            viewBg.setAlpha(1.0f);
            mOnSeekBarStatusListener.onFinishUnlock();
        }

    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                isSlide = false;
                mStartTouchX = (int) event.getX();
                break;
            case MotionEvent.ACTION_MOVE:

                mSlideSeekBar.getLocationOnScreen(mLocation);
                int mSeekBarX = mLocation[0];
                int seekBarThumbLeft = mSeekBarX + DensityUtil.dip2px(mContext, 80) + mSlideSeekBar.getThumbOffset();

                if (mStartTouchX < seekBarThumbLeft) {
                    isSlide = true;
                }
                break;
            case MotionEvent.ACTION_UP:
                isSlide = false;
                break;
            default:
                break;
        }

        return false;
    }


    /**
     * seekBar滑动完成监听
     */
    public interface OnSeekBarStatusListener {

        void onFinishUnlock();

    }


}
示例Fragment
当然无论Activity还是Fragment都无所谓,这里我是继承了自己BaseFragment,这里并没有必须要求的意思,只需要实现滑动解锁完成的接口SlidingSeekBar.OnSeekBarStatusListener即可

/**
 * 描述:滑动解锁
 * Created by ruihe on 2016/5/28.
 */
public class FragmentThree extends BaseFragment implements SlidingSeekBar.OnSeekBarStatusListener {


    private View mView;
    private View viewBg;
    private TextView tvSlideToRightHint;
    private SlidingSeekBar slideSeekBar;


    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            slideSeekBar.setProgress(0);
            tvSlideToRightHint.setAlpha(1.0f);
            viewBg.setAlpha(0.0f);
        }
    };

    @Override
    public void onAttached() {

    }

    @Override
    public void getFragmentView(View view, Bundle savedInstanceState) {
        mView = view;
        initView();
        initListener();
        bindData();
    }


    @Override
    public int getContentViewId() {
        return R.layout.fragment_three;
    }


    private void initView() {
        viewBg = mView.findViewById(R.id.view_bg);
        tvSlideToRightHint = (TextView) mView.findViewById(R.id.tv_slide_to_right);
        slideSeekBar = (SlidingSeekBar) mView.findViewById(R.id.seek_bar);

    }

    private void initListener() {
        slideSeekBar.initSlideToRightUnlock(holder, tvSlideToRightHint, viewBg, this);
    }


    private void bindData() {
        holder.mTitleView.removeAllMenu();
        holder.mTitleView.setTitle(R.string.main_third);

    }

    @Override
    public void onDetached() {

    }

    @Override
    public void onFinishUnlock() {
        Toast.makeText(holder, "恭喜,解锁成功!", Toast.LENGTH_SHORT).show();
        mHandler.sendEmptyMessageDelayed(0, 3000);
    }
}
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
<span style="font-family:Arial, Helvetica, sans-serif;">布局文件</span><pre name="code" class="java">fragment_three.xml:
</pre><pre name="code" class="java"><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:padding="5dp"
        android:text="seekBar滑动解锁" />


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center">

        <View
            android:id="@+id/view_bg"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#4c000000" />


        <RelativeLayout
            android:layout_width="280dp"
            android:layout_height="60dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="30dp">

            <com.ruihe.demo.common.utils.view.SlidingSeekBar
                android:id="@+id/seek_bar"
                style="@style/style_slide_to_right_unlock"
                android:layout_width="280dp"
                android:layout_height="60dp"
                android:padding="0dp" />

            <TextView
                android:id="@+id/tv_slide_to_right"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginLeft="80dp"
                android:gravity="center"
                android:text="右滑解锁"
                android:textColor="#CCFFFFFF"
                android:textSize="18sp" />
        </RelativeLayout>

    </RelativeLayout>


</LinearLayout>


seekBar的样式:

style_slide_to_right_unlock.xml:
</pre><pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html"> <!--滑动截图的Style-->

    <style name="style_slide_to_right_unlock" parent="@android:style/Widget.SeekBar">
        <item name="android:maxHeight">280dp</item>
        <item name="android:minHeight">280dp</item>
        <item name="android:maxWidth">60dp</item>
        <item name="android:minWidth">60dp</item>
        <item name="android:indeterminateOnly">false</item>
        <item name="android:indeterminateDrawable">
            @android:drawable/progress_indeterminate_horizontal
        </item>
        <item name="android:progressDrawable">@drawable/shape_map_shot</item>
        <item name="android:thumb">@drawable/ic_map_slide</item>
        <item name="android:thumbOffset">-3dp</item>
    </style>


</pre><pre name="code" class="html"><pre name="code" class="html">其中@drawable/shape_map_shot为底色背景这里是用shape画的
<pre name="code" class="html">shape_map_shot.xml

<pre name="code" class="html"><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <corners android:radius="50dp" />

    <solid android:color="#292d37" />


</shape>
</pre><pre name="code" class="html">
@drawable/ic_map_slide为上层滑动的拇指图标:

</pre><pre>

<img src="https://img-blog.csdn.net/20160530110256676?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

好的这样就可以了。附上效果图

seekBar实现滑动解锁[通俗易懂]



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149617.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月24日 下午5:16
下一篇 2022年6月24日 下午5:36


相关推荐

  • 【☠️️社死现场の老板来了☠️️】小伙,搞C语言嵌入式开发这么久了,还不知道u8、u16、u32、s8、s16、s32是什么意思啊?

    【☠️️社死现场の老板来了☠️️】小伙,搞C语言嵌入式开发这么久了,还不知道u8、u16、u32、s8、s16、s32是什么意思啊?首先开门见山:u8是unsignedchar,u16是unsignedshort,u32是unsignedlong;s8是signedchar,s16是signedshort,s32是signedlong。然后娓娓道来:显而易见,u就是unsigned的缩写,s就是signed的缩写,8就表示8个二进制位(一个字节),16就表示16个二进制位(两个字节),32就表示32个二进制位(四个字节)。这样写的目的,是为了提高跨平台的移植性与兼容性。不同平台数据类型定义都不尽相同,一套代码要想.

    2022年10月16日
    5
  • PostgresSQL 分页查询 SQL语句

    PostgresSQL 分页查询 SQL语句SELECT*FROM“库名”.“表名”wheretellike‘%1%’orderbyidasclimit3OFFSET0;

    2022年10月19日
    5
  • Windows 打开和关闭默认共享方法汇总

    [原文]在使用xcopy上传文件至远程windows服务器时,出现“Invaliddriverspecification”(无效驱动器规格),经过各种排查,最终发现是服务器“关闭默认共享”导致的。Windows启动时都会默认打开admin$ipc$和每个盘符的共享,对于不必要的默认共享,一般都会把它取消掉,可当又需要打开此默认共享时,又该从哪里设置呢。经过自己的验证,汇总出一下方法。一:查看window共享资源运行–>cmd–>输入netshare二:彻底关闭

    2022年4月7日
    54
  • 即梦AI和可灵AI的区别

    即梦AI和可灵AI的区别

    2026年3月12日
    2
  • 对数周期幂率模型(LPPL)

    对数周期幂率模型(LPPL)什么是对数周期幂率模型对数周期性幂律模型由 Johansen 和 Sornette 提出 Johansen Ledoit Sornette JLS 模型假设存在两类交易者 理性的基本面交易者和非理性的噪音交易者 JLS 模型借鉴统计物理中解释铁磁相变的 Ising 模型 该模型在 JLS 模型的基础上发展而来 交易者之间相互模仿 可作出买和卖的决策 由于这些相互作用 交易者间会形成相似交易行为的群体 这将导致泡

    2026年3月18日
    2
  • 【ceph】vdbench的使用教程——裸盘测试和文件系统测试

    【ceph】vdbench的使用教程——裸盘测试和文件系统测试目录即看即用详细说明vdbench简介常用执行选项和参数文件说明1、文件系统2、块设备(裸盘测试)运行使用1、单机运行2、联机运行结果分析1、输出文件2、结果分析测试说明1、测试总结2、常见测试参数即看即用测试一下vdbench的可用性:进入vdbench相应目录下./vdbench-t运行测试模型./vdbench-f{filename}-o{exportpath}#注:-f后接测试参数文件名,-o后接导出测试.

    2022年5月12日
    87

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号