Android模拟实现滑动解锁界面

本文实例为大家分享了Android模拟滑动解锁界面,供大家参考,具体内容如下

实现逻辑

  • 自定义一个view继承view类,实现里面的方法
  • 在构造方法中加载出图片资源.在onMeasure中获取背景的宽和高作为自定义控件的宽和高
  • 在onDraw方法中绘制出滑块,在控件的布局文件中设置控件的背景图片
  • 设置滑块的触摸事件,分别算出当手指按下屏幕.移动,离开屏幕时滑块的位置
  • 在移动的过程中,对滑块的位置进行限定,使滑块的位置不能超过指定的区域
  • 在手指离开屏幕的事件中判定手指的位置,如果滑块没有到达最右边,那就让滑块回到开始的位置
  • 通过重写computeScroll方法,让滑块在手指离开屏幕的时候如果没有到达最右边,那就让他回到开始的位置
  • 设置一个回调接口,用来监听滑块是否到达最右侧

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:gravity="center_horizontal"
tools:context="com.example.a7_.MainActivity">

<com.example.a7_.MyView
  android:layout_alignParentBottom="true"
  android:id="@+id/mv"
  android:background="@mipmap/lockviewbg"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />
</RelativeLayout>

自定义控件代码

package com.example.a7_;

  import android.content.Context;
  import android.graphics.Bitmap;
  import android.graphics.BitmapFactory;
  import android.graphics.Canvas;
  import android.graphics.Paint;
  import android.util.AttributeSet;
  import android.util.Log;
  import android.view.MotionEvent;
  import android.view.View;
  import android.widget.Scroller;

  /**
   * Created by Administrator on 2017.05.28.0028.
   */

  public class MyView extends View {

  private final Bitmap slidBitmap;
  private final Bitmap bgBitmap;
  private int startx;
  private int destance;
  private float endx;
  private final Scroller scroller;

  public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);

    //加载图片资源
    slidBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.switch_button);
    bgBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.lockviewbg);
    //创建scroller对象
    scroller = new Scroller(context);
  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    //设置自定义控件的宽和高,,以背景图片为标准
    setMeasuredDimension(bgBitmap.getWidth(),bgBitmap.getHeight());
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //绘制图片
    canvas.drawBitmap(slidBitmap,0,0,null);
  }

  //设置滑块的触摸事件
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()){
      case MotionEvent.ACTION_DOWN:
        //当手指按下的时候,记录坐标
        startx = (int) event.getX();
        break;
      case MotionEvent.ACTION_MOVE:
        //当手指移动的时候,记录移动的距离
        destance = (int)(event.getX()-startx);
        //限制滑块移动的区间
        if (destance<0){
          destance = 0;
        }else if (destance>bgBitmap.getWidth()-slidBitmap.getWidth()){
          destance = bgBitmap.getWidth()-slidBitmap.getWidth();
        }
        //将滑块移动至该位置
        scrollTo( -destance,0);
        break;
      case MotionEvent.ACTION_UP:
        //当手指离开时,记录手指离开的位置
        if (destance<bgBitmap.getWidth()-slidBitmap.getWidth()){
          //手指抬起时,如果滑块不在右边,那就让他回到左边
          startx = destance;
          int dx = 0-destance;
          scroller.startScroll(startx,0,dx,0);
          invalidate();
        }else {
          //开启解锁
          listener.onUnlock(this);
        }
        break;
    }
    invalidate();
    return true;
  }

  //重写computeScroll方法 调用invalidate之后 会调用draw draw会调用到这个computeScroll
  @Override
  public void computeScroll() {
    if (scroller.computeScrollOffset()){
      //获取滑块当前的位置
      int currx = scroller.getCurrX();
      scrollTo(-currx,0);
      //重新绘制
      invalidate();
    }
  }

  //设置一个解锁的接口
  interface onUnLockListener{
    void onUnlock(MyView view);
  }

  private onUnLockListener listener;

  public void setOnLockListener(onUnLockListener listener){
      this.listener = listener;
  }

  }

##核心代码

  package com.example.a7_;

  import android.support.v7.app.AppCompatActivity;
  import android.os.Bundle;

  public class MainActivity extends AppCompatActivity {

  private MyView myView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //初始化控件
    myView = (MyView) findViewById(R.id.mv);
    //设置监听事件
    myView.setOnLockListener(new MyView.onUnLockListener() {
      @Override
      public void onUnlock(MyView view) {
        //触发监听,结束页面
        finish();
      }
    });
  }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android三级缓存原理讲解

    三级缓存 内存缓存 本地缓存(SD卡缓存) 网络缓存 缓存顺序:首先从网络获取图片资源,然后将当前的图片缓存到本地,然后再缓存到内存中,那么下次访问图片资源就会优先从内存获取图片资源,如果内存中没有那么再去本地获取图片资源,如果本地还是没有,那么再从网络获取图片资源. 内存缓存 特点: 访问内存速度最快 不浪费流量 本地缓存 特点: 访问速度中等 不浪费流量 网络缓存 特点: 访问速度慢 浪费流量 网络缓存 网络缓存顾名思义就是从网络获取图片资源,然后来进行显示,那么我们可以通过AsyncTas

  • Android实现QQ侧滑菜单效果

    QQ侧滑菜单的Android实现代码,供大家参考,具体内容如下 实现逻辑 1.先写出菜单页面和主页面的布局 2.创建一个类,继承RelativeLayout,实现里面的onLayout 3.在主布局文件中添加子空间 4.在onLayout里面获取子控件的宽和高,并对子控件的位置进行绘制 5.给子布局设置滑动事件,分别在手指落下\移动\抬起的时候,获取手指的位置 6.在手指移动的过程中,对菜单页面的移动距离进行限制,防止菜单页面跑出指定的页面 7.在手指抬起的时候,判定一下手指移动的距离,如果移动

  • android使用Path绘制出多边形

    在讲使用path绘制多边形时,讲下Canvas的translate(),rotate()方法的使用,本博客中会使用这方面的知识,先单独讲下,搞懂了这个,下面讲path绘制多边形就简单的多,我们知道每次我们使用canvas.draw...()绘制什么图形的时候,都是创建了一个新的图层,如果不知道图层是啥意思,就去看下我之前写的关于canvas基础,有讲这方面的,其实你可以理解成每次新创建了一个activity,然后把这个activity压入栈中,translate()是画布平移,其实每次画布还是同

  • Android实现下拉展示条目效果

    本文实例为大家分享了Android下拉展示条目的具体代码,供大家参考,具体内容如下 布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"

  • Android触摸事件和mousedown、mouseup、click事件之间的关系

    一.移动端 触摸事件 ontouchstart.ontouchmove.ontouchend.ontouchcancel 1.Touch事件简介 pc上的web页面鼠 标会产生onmousedown.onmouseup.onmouseout.onmouseover.onmousemove的事件,但是在移动终端如iphone.ipod Touch.ipad上的web页面触屏时会产生ontouchstart.ontouchmove.ontouchend.ontouchcancel事件,分别对应了触屏

  • Android四大组件之Activity详解

    一.Activity的生命周期 首先,我们来了解一下Activity典型的生命周期 一个Activity从启动到结束会以如下顺序经历整个生命周期: onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory().包含了六个部分,还有一个onRestart()没有调用, 下面就来一一介绍 onCreate():当 Activity 第一次创建时会被调用.当 Activity 第一次创建时会被调用.这是生命周

  • Android自定义实现侧滑菜单效果

    本文实例为大家分享了Android自定义实现侧滑菜单的具体代码,供大家参考,具体内容如下 实现原理:继承ViewGroup控件要显示到界面上需要重写OnMeature() OnLayout(),因此在实现OnLayout()的时候,将菜单界面划出到屏幕左侧,动态改变菜单界面距离scrollXto()左边界的距离就能实现滑动效果. 1.继承ViewGroup 2.事件分发机制 3.状态监听 在主界面中添加两个子控件 <com.oblivion.ui.SlideMenu xmlns:android=

  • Android四大组件之Service详解

    一.Service简介 Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件. Service是Android中实现程序后台运行的解决方案,它非常适用于去执行那些不需要和用户交互而且还要求长期运行的任务.Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作. 二.Serv

  • Android ListView列表视图的使用方法

    前言 当你要将某个从数据库或者文件中获得相当大的数据,在界面中向用户展示的时候,由于定义一个个视图比较麻烦,Android中提供了类似于数组的控件–ListView. 使用方法: 假设我们要转的数据是一个Person对象数组 package cn.zhuangzhihuang.mylist; public class Person { private String name; private String tel; public Person(String name, String tel) {

  • Android四大组件之BroadcastReceiver详解

    BroadcastReceiver(广播接收器),在Android开发中,BroadcastReceiver的应用场景非常多,属于Android四大组件之一. Android 广播分为两个角色:广播发送者.广播接收者 一. 作用 用于监听 / 接收 应用发出的广播消息,并做出响应 应用场景: 不同组件之间通信(包括应用内 / 不同应用之间) 与 Android 系统在特定情况下的通信(如当电话呼入时.网络可用时) 多线程通信 二.实现原理 Android中的广播使用了设计模式中的观察者模式:基于

随机推荐