Android 滑动解锁
来源:互联网 发布:java -classpath 用法 编辑:程序博客网 时间:2024/05/16 10:55
activity_main.xml布局
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:test="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.slideunlock_demo1.MainActivity"> <com.example.slideunlock_demo1.SlideLock android:id="@+id/slideLock" android:layout_width="match_parent" android:layout_height="match_parent" /> <ImageView android:visibility="gone" android:id="@+id/imageView" android:src="@drawable/bd" android:layout_width="match_parent" android:layout_height="match_parent" /></RelativeLayout>
自定义View类
package com.example.slideunlock_demo1;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.Toast;/** * created by 王志伟 at 2017/9/27 */public class SlideLock extends View { private Bitmap jiesuo_bg; private Bitmap jiesuo_button; private int bg_width; private int bg_height; private int block_width; private int measuredWidth; private int measuredHeight; private float downX; private float downY; private float currentX; private float currentY; private boolean isOnBlock; private int left; private int right; private OnUnlockListener onUnlockListener; public SlideLock(Context context) { super(context); init(); } public SlideLock(Context context, AttributeSet attrs) { super(context, attrs); init(); } public SlideLock(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { jiesuo_bg = BitmapFactory.decodeResource(getResources(), R.mipmap.jiesuo_bg); jiesuo_button = BitmapFactory.decodeResource(getResources(), R.mipmap.jiesuo_button); bg_width = jiesuo_bg.getWidth(); bg_height = jiesuo_bg.getHeight(); block_width = jiesuo_button.getWidth(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(jiesuo_bg, measuredWidth / 2 - bg_width / 2, measuredHeight / 2 - bg_height / 2, null); //控制边界 if (currentX < left) { currentX = left; } else if (currentX > right) { currentX = right; } canvas.drawBitmap(jiesuo_button, currentX, currentY, null); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); measuredWidth = getMeasuredWidth(); measuredHeight = getMeasuredHeight(); //获取一开始的位置 currentX = measuredWidth / 2 - bg_width / 2; currentY = measuredHeight / 2 - bg_height / 2; left = measuredWidth / 2 - bg_width / 2; right = measuredWidth / 2 + bg_width / 2 - block_width; } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //判断手指是否按在了小球上 downX = event.getX(); downY = event.getY(); isOnBlock = isOnBlock(downX, downY); if (isOnBlock) { Toast.makeText(getContext(), "按到了", Toast.LENGTH_SHORT).show(); } break; case MotionEvent.ACTION_MOVE: if (isOnBlock) { //获取最新的位置 float moveX = event.getX(); currentX = moveX - block_width / 2; invalidate(); } break; case MotionEvent.ACTION_UP: isOnBlock = false; if (currentX < right - 5) { //应该弹回去 currentX = left; } else { if (onUnlockListener != null) { Toast.makeText(getContext(), "解锁", Toast.LENGTH_SHORT).show(); onUnlockListener.setUnlock(true); } } invalidate(); break; case MotionEvent.ACTION_CANCEL: break; } return true; } /** * @param downX * @param downY * @return */ private boolean isOnBlock(float downX, float downY) { //先计算圆心点 float rx = currentX + block_width / 2; float ry = currentY + block_width / 2; double distance = Math.sqrt((downX - rx) * (downX - rx) + (downY - ry) * (downY - ry)); if (distance < block_width / 2) { return true; } return false; } public void setOnUnlockListener(OnUnlockListener onUnlockListener) { this.onUnlockListener = onUnlockListener; }}
自定义接口类
package com.example.slideunlock_demo1;/** * created by 王志伟 at 2017/9/27 */public interface OnUnlockListener { void setUnlock(boolean unlock);}
MainActivity类
package com.example.slideunlock_demo1;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { private SlideLock slideLock; private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { slideLock = (SlideLock) findViewById(R.id.slideLock); imageView = (ImageView) findViewById(R.id.imageView); slideLock.setOnUnlockListener(new OnUnlockListener() { @Override public void setUnlock(boolean unlock) { if (unlock) { slideLock.setVisibility(View.GONE); imageView.setVisibility(View.VISIBLE); } } }); }}
以上就是简单实现一个滑动解锁了,希望大神多多指点,广大读者留言建议!!!
阅读全文
0 0
- android滑动解锁
- Android滑动解锁控件
- Android 滑动解锁
- android仿iphone滑动解锁
- android 滑动密码解锁界面
- 滑动解锁
- 滑动解锁
- 滑动解锁
- 滑动解锁
- 滑动解锁
- android仿三星I900滑动解锁
- android 仿三星I900滑动解锁
- android 仿三星I900滑动解锁
- android仿ipone滑动解锁控件
- android滑动解锁的震动效果
- Android Jelly Bean滑动解锁控件实现
- Android 类似向右滑动解锁控件
- Android通过指令模拟touch滑动解锁
- File类
- strust2框架
- 四三、getBoundingClientRect的用法
- Android File 文件操作心得记录
- 深入解析python版SVM
- Android 滑动解锁
- nvm和nodejs安装使用(转)
- 关于form表单以get方式传参的问题
- Tracking相关的文章
- Caffe_Windows学习笔记(三)搭建自己的网络mnist在caffe上进行训练与学习
- 物联网+区块链的解决方案 应用项目
- CRM SKU SPU 等名词介绍
- vee-validate 验证
- canvas标签