简单的滑动解锁

最近有一个需求是要滑动解锁在网上看了一些例子但是我觉得他们的太复杂了功能比较好但是我不需要所以自己按着他的思路写了一个

public class MyRelativeLayout extends RelativeLayout {
private Bitmap myBitmap=null;
private Context mContext=null;
private TextView leftButton;
private static final String LOG="MyRelativeLayout";
public MyRelativeLayout(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext=context;
inintBitamp();
}
public MyRelativeLayout(Context context){
super(context);
mContext=context;
inintBitamp();
}


public MyRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mContext=context;
inintBitamp();
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
leftButton=(TextView) findViewById(R.id.leftButton);
}
private void inintBitamp(){
if (myBitmap==null) {
myBitmap=BitmapFactory.decodeResource(mContext.getResources(),
R.drawable.ic_launcher);

}
}


private int startLockx=1000;
@Override
public boolean onTouchEvent(MotionEvent event) {
int x=(int) event.getX();
int y=(int)event.getY();
Log.i(LOG, "onTouchEvent"+"isX"+x+"isY"+y);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startLockx=(int) event.getX();
//用户按下的时候我们肯定要判断是否按下载按钮上面,普通的方法是判断XY轴
//比对两点之间的距离但是Android封装了一个矩形给我们用
//当然我们还可以利用焦点应为判断这个按钮是否获得了
return  ifPress(event);
case MotionEvent.ACTION_MOVE:
startLockx=x;
invalidate();
return true;
case MotionEvent.ACTION_UP:
esTiMateIfSucceed(event);
return true;
default:
break;
}


return super.onTouchEvent(event);
}

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawPrint(canvas);//重要的方法
}
private void drawPrint(Canvas canvas) {
int  startX=startLockx-myBitmap.getWidth();//减去图片的宽度好计算
Log.d(LOG, "startX="+startX+"startLockx="
+startLockx+"myBitmap.getWidth()"+myBitmap.getWidth());
int startY= leftButton.getTop();
Log.d(LOG, "startY="+startY);
//这里相信大家一定知道了大神这儿写的是如果X坐标小于0就默认给他5如果不是就把startx给他
//但是我的想法是既然小于0那就表示他正点击最左边的部分我们就把leftbutton的getleft()给他
canvas.drawBitmap(myBitmap,  startX < 0 ? 5 : startX , startY , null);
}
private void esTiMateIfSucceed(MotionEvent event) {
int x=(int) event.getX();//当前松开的X轴坐标
Log.e(LOG, "esTiMateIfSucceed : x====" + x + "   this.getRight() " + this.getRight() );
boolean isButton=Math.abs(x-getRight())<=60;
if (isButton) {
Toast.makeText(mContext, "滑动到底消失对话框", 1000).show();
rePlaceMentView();
//一个震动我们也来一个当然还可以响铃什么的 记得要设置权限震动的  这个我就不贴出来了自己可以百度的
virbate();
//许多大神在这儿使用了一个handler 我们就用一个接口好了
if (onFinthListener!=null) {
onFinthListener.onfinth();
}
}
else{
//
// 复原场景的时候是不是也定以了一个方法我们就能用到了封装就是好省的代码冗余
rePlaceMentView();
}
}
private void virbate() {
Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(100);//震动多久有你选择有本事你把它手机震动烂 哼哼
}
private void rePlaceMentView() {
startLockx=1000;
leftButton.setVisibility(View.VISIBLE);
invalidate();

}
private boolean ifPress(MotionEvent event) {
Rect rect=new Rect();
leftButton.getHitRect(rect);
//判断是否按中了按钮
boolean  ifPress=rect.contains((int)event.getX(), (int)event.getY());
if (ifPress)
//隐藏按钮但是还占据位置View.GONE隐藏按钮也不占用位置
leftButton.setVisibility(View.INVISIBLE);
return ifPress;
}

public interface MyOnFinthListener{
public void onfinth();
}
private MyOnFinthListener onFinthListener=null;

public void registOnfinthlistener(MyOnFinthListener myONfinth){
this.onFinthListener=myONfinth;
}


接下来是activity的---------------------------------------------------------------------------------------------------


public class MainActivity extends Activity implements MyOnFinthListener{
private Context mContext=null;
private MyRelativeLayout myRelativeLayout;
private TextView duihuakuang;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = MainActivity.this;
/*设置全屏,无标题设置这些东西肯定是要在设置布局前面才有用的*/
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
inintView();
    }
private void inintView() {
myRelativeLayout=(MyRelativeLayout) findViewById(R.id.zijidelayout);
myRelativeLayout.registOnfinthlistener(this);
duihuakuang=(TextView) findViewById(R.id.duihuakuang);
}




@Override
public void onfinth() {
Toast.makeText(mContext, "妖怪消失吧", 3000).show();
duihuakuang.setVisibility(View.INVISIBLE);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值