自定义View之滑动解锁
来源:互联网 发布:软件编程技术培训 编辑:程序博客网 时间:2024/05/17 22:10
1.自定义Viewpublic 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(); } 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(); } public SlideLock(Context context, AttributeSet attrs) { super(context, attrs); init(); } public SlideLock(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @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; }}2.自定义接口public interface OnUnlockListener { public void setUnlock(boolean unlock);}3.Main XML<?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"> <com.erin.customviewdemos.view.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="@mipmap/bd" android:layout_width="match_parent" android:layout_height="match_parent" /></RelativeLayout>
4.MainActivitypublic class MainActivity extends AppCompatActivity { private ImageView imageView; private SlideLock slideLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 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
- 自定义View之滑动解锁
- 自定义View向右滑动解锁
- 自定义锁屏demo之滑动解锁
- Android自定义控件之滑动解锁
- 自定义控件之滑动解锁、圆中嵌字
- Android自定义控件之滑动解锁
- android自定义view之九宫格解锁
- android自定义view之九宫格解锁
- 自定义View之滑动操作
- 自定义手指滑动解锁
- 自定义 滑动解锁
- 自定义view解锁
- 自定义View实现解锁
- Android学习 - 自定义锁屏demo之滑动解锁
- Android自定义控件之滑动解锁九宫格
- 自定义View之列表滑动删除DEMO
- android自定义View之滑动开关SlideButton
- 自定义View之垂直滑动的ViewPager
- [编程题] 数字翻转
- CSS3动画
- Java代码性能优化
- linux ubuntu 16.04下deb文件的安装和一些问题的解决
- 弹钢琴
- 自定义View之滑动解锁
- Android中shape中的属性大全
- 1002. 写出这个数
- oracle二次开发调用外部C函数。
- 【南阳理工】 108 士兵杀敌(一)
- iOS-XML文件解析(原生NSXMLParser和GDataXML两种解析方式)
- 前端_抽 奖
- 定时函数
- ElasticSearch