自定义view来绘制一个类似滑动解锁的button,注释都在,效果如下

代码在下面,替换一下资源,可以直接使用,如果需要画的是圆角的话,需要把下面两行注释的DrawLine的注释打开,然后把两行drawRoundRect注释掉。

package com.vendingontrack.vendcoin.customView;import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;import androidx.annotation.Nullable;import com.vendingontrack.vendcoin.R;public class SlideUnlockView extends View {private Paint mPaint;//绘制背景private Paint mTextPaint;//绘制文字private Paint mSlideTextPaint;//滑动文字private Paint mSwipeBgPaint;private Bitmap mIconBitmap;private int mWidth;private int mHeight;private int mPadding;private String content = "Slide to begin";private String mSlideContent = "VendCoin";private Rect mTextRect;private float mDrawX;private boolean mCanMove;private OnUnlockListener mListener;private int mBackgroudColor;private int mTextColor;private int mIconId;private boolean unSlide;private int mFillColor;private Context mContext;private boolean isSlide;public SlideUnlockView(Context context) {this(context,null);}public SlideUnlockView(Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);}public SlideUnlockView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mContext = context;initAttr(attrs);init();}private void initAttr(AttributeSet attrs){TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.SlideUnlockView);mBackgroudColor = ta.getColor(R.styleable.SlideUnlockView_backgroundColor,getResources().getColor(R.color.color_E9DDC7));mTextColor = ta.getColor(R.styleable.SlideUnlockView_textColor,getResources().getColor(R.color.clolor_091431));mIconId = ta.getResourceId(R.styleable.SlideUnlockView_icon, R.drawable.icon_thumb);
//        unSlide = ta.getBoolean(R.styleable.SlideUnlockView_unSlide,false);ta.recycle();}//设置为不可滑动public void setUnSlide(boolean unable){this.unSlide = unable;}private void init() {mTextPaint = new Paint();mTextPaint.setColor(mTextColor);mTextPaint.setAntiAlias(true);mTextPaint.setTextSize(sp2px(getContext(),16));mTextRect = new Rect();mTextPaint.getTextBounds(content,0,content.length(),mTextRect);mSlideTextPaint = new Paint();mSlideTextPaint.setColor(mContext.getResources().getColor(R.color.color_E9DDC7));mSlideTextPaint.setAntiAlias(true);mSlideTextPaint.setTextSize(sp2px(getContext(),22));
//        mTextRect = new Rect();mSlideTextPaint.getTextBounds(mSlideContent,0,mSlideContent.length(),mTextRect);mIconBitmap = BitmapFactory.decodeResource(getResources(), mIconId);mPadding  = 0;mHeight = mIconBitmap.getHeight()+mPadding*2;mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setStyle(Paint.Style.FILL);mPaint.setStrokeCap(Paint.Cap.ROUND);mPaint.setColor(mBackgroudColor);mPaint.setStrokeWidth(mHeight);mSwipeBgPaint = new Paint();mSwipeBgPaint = new Paint();mSwipeBgPaint.setAntiAlias(true);mSwipeBgPaint.setStyle(Paint.Style.FILL);mSwipeBgPaint.setStrokeCap(Paint.Cap.ROUND);mSwipeBgPaint.setColor(mContext.getResources().getColor(R.color.clolor_091431));mSwipeBgPaint.setStrokeWidth(mHeight);//默认滑动图标跟文字间的间隔int middle = dp2px(getContext(), 20);mWidth = mPadding + mHeight*2 + mTextRect.width() + middle *2;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int wSpecMode = MeasureSpec.getMode(widthMeasureSpec);int wSpecSize = MeasureSpec.getSize(widthMeasureSpec);//如果设定的宽度比控件默认需求的大,则修改,否则就用默认宽度if (wSpecMode == MeasureSpec.EXACTLY){if (wSpecSize>mWidth){mWidth = wSpecSize;}}setMeasuredDimension(mWidth,mHeight);}public void setUnlockListener(OnUnlockListener listener){mListener = listener;}@Overrideprotected void onDraw(Canvas canvas) {if (mDrawX < mPadding ){mDrawX = mPadding;}else if (mDrawX > mWidth - mIconBitmap.getWidth()-mPadding){mDrawX = mWidth - mIconBitmap.getWidth()-mPadding;}canvas.drawRoundRect(new RectF(0, 0, mWidth, mHeight), 18, 18, mPaint);//画背景颜色,需要给圆形笔锋预留半个高度的位置
//        canvas.drawLine(mHeight/2,mHeight/2,mWidth-mHeight/2,mHeight/2,mPaint);int textX = mWidth / 2 - mTextRect.width()/2;//        canvas.drawLine(mHeight/2,mHeight/2,mDrawX+mIconBitmap.getWidth()/2,mHeight/2,mSwipeBgPaint);canvas.drawRoundRect(new RectF(0, 0, mDrawX+mIconBitmap.getWidth(), mHeight), 18, 18, mSwipeBgPaint);if(isSlide){canvas.drawText(mSlideContent, textX, mHeight / 2 + mTextRect.height() / 2, mSlideTextPaint);}else {//绘制文字到中间位置canvas.drawText(content, textX, mHeight / 2 + mTextRect.height() / 2, mTextPaint);}//根据滑动位置绘制图标canvas.drawBitmap(mIconBitmap,mDrawX,mPadding,mPaint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();switch (event.getAction()){case MotionEvent.ACTION_DOWN:isSlide = false;//如果不可滑动,立即返回if (unSlide)return false;if (x <= mIconBitmap.getWidth()+mPadding){mCanMove = true;}return true;case MotionEvent.ACTION_MOVE://如果是可移动状态才继续绘制if (mCanMove){isSlide = true;mDrawX = x;invalidate();}return true;case MotionEvent.ACTION_UP:isSlide = false;//如果是可移动状态才继续绘制if (mCanMove){reset();mCanMove = false;//判断是否在指定位置抬起手指if (mDrawX >= mWidth - mIconBitmap.getWidth()-mPadding){if (mListener!=null)mListener.onUnlock();}}break;}return super.onTouchEvent(event);}public void setmCanMove(boolean canMove){mCanMove = canMove;}//用属性动画将图标位置重置private void reset(){ObjectAnimator animator = ObjectAnimator.ofFloat(this,"mDrawX",mDrawX,mPadding);animator.setDuration(200);animator.start();}private float getMDrawX() {return mDrawX;}private void setMDrawX(float mDrawX) {this.mDrawX = mDrawX;invalidate();}public interface OnUnlockListener{void onUnlock();}/*** dp转px** @param context 上下文* @param dpValue dp值* @return px值*/public static int dp2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}/*** sp转px** @param context 上下文* @param spValue sp值* @return px值*/public static int sp2px(Context context, float spValue) {final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;return (int) (spValue * fontScale + 0.5f);}}

Android 自定义View 滑动解锁相关推荐

  1. android自定义View: 九宫格解锁

    本系列自定义View全部采用kt 系统:mac android studio: 4.1.3 kotlin version1.5.0 gradle: gradle-6.5-bin.zip 废话不多说,先 ...

  2. android 自定义view: 蛛网/雷达图(三)

    本系列自定义View全部采用kt 系统mac android studio: 4.1.3 kotlin version1.5.0 gradle: gradle-6.5-bin.zip 本篇效果: 蛛网 ...

  3. android 自定义view滚动条,Android自定义View实现等级滑动条的实例

    Android自定义View实现等级滑动条的实例 实现效果图: 思路: 首先绘制直线,然后等分直线绘制点: 绘制点的时候把X值存到集合中. 然后绘制背景图片,以及图片上的数字. 点击事件down的时候 ...

  4. Android 自定义View(四)实现股票自选列表滑动效果

    一.前言 Android 开发过程中自定义 View 真的是无处不在,随随便便一个 UI 效果,都会用到自定义 View.前面三篇文章已经讲过自定义 View 的一些案例效果,相关类和 API,还有事 ...

  5. android自定义view之九宫格解锁

    android自定义view之九宫格解锁 更多细节请看源码 https://github.com/que123567/lockview 1. 定义一个类作为九宫格的格子 包含坐标和索引(用来记录密码) ...

  6. android 高仿 探探卡片滑动,Android自定义View仿探探卡片滑动效果

    Android自定义View仿探探卡片滑动这种效果网上有很多人已经讲解了实现思路,大多都用的是RecyclerView来实现的,但是我们今天来换一种实现思路,只用一个自定义的ViewGroup来搞定这 ...

  7. Android自定义View,跟随手指滑动效果

    Android自定义View,实现跟随手指滑动效果, 效果如下: 一,重写onTouchEvent方法 最后返回true 二,在MotionEvent.ACTION_MOVE情况下改变自定义view ...

  8. Android自定义View-滑动解锁按钮

    Android自定义View-滑动解锁按钮 写在前面 一.实现的思路 二.先上成品图 三.自定义属性 四.使用 五.具体实现 写在前面 最近由于项目需求,需要有一个类似苹果的滑动解锁控件,抱着万事不求 ...

  9. android 车辆轨迹,Android自定义view实现车载可调整轨迹线

    本文实例为大家分享了Android自定义view完成车载可调整轨迹线的具体代码,供大家参考,具体内容如下 同事做的view,拿过来做个记录. /** * */ package com.text.myv ...

最新文章

  1. 机器学习笔记(八)集成学习
  2. Aliyun Java Initializr 和 Spring 官方的到底有什么区别?
  3. Java注解(1)-注解基础
  4. python培训班骗局-深圳盐田区python专业培训机构,真实经历分享
  5. 面试题--------3、string stringbuffer stringbuilder的区别
  6. Oracle连续排名,oracle不连续排名rank() over(order by column desc),连续排名 dense_rank over(order by)...
  7. 【idea插件开发】从0入门idea插件开发,idea插件开发教程,如何开发idea插件
  8. 中医预约管理系统都需要哪些功能?
  9. python处理excel格式变化,分类,归类,行变列
  10. 六大危害不容忽视 笔记本外接显示器杂谈
  11. 如何提高研发部门工作效率的探讨
  12. 大数据信息资料采集:淘宝飞猪旅游酒店客栈旅社公寓数据信息采集
  13. ogre 学习笔记 - Day 7
  14. UBUNTU 11.10 (32位)双网卡 NAT 实现局域网共享上网
  15. Jenkins Gitlab 插件及 Gitlab 全局变量
  16. 移动 网络 连mysql_中国移动MySQL数据库优化最佳实践
  17. 朝鲜青年结婚流行新大件——手机
  18. 进程的概念 | PCB的认识
  19. 在智能时代我们能做什么---读《智能时代》有感
  20. Android重点面试题

热门文章

  1. SolrJ更新索引数据
  2. 计算机网络HTTP篇(一)HTTP 常见面试题
  3. matlab中内置D-STATCOM模型
  4. 运放震荡自激原因及解决办法
  5. git安装 苹果笔记本_个人博客第5篇——安装node.js和Hexo
  6. UINavigationController 自定义转场动画(模仿淘宝App跳转)
  7. 双目视觉焦距_教你提高双目立体视觉系统的精度!
  8. 物理cpu数和cpu核数和逻辑cpu数和vcpu区别
  9. 新手解惑:详解零欧姆电阻的十二种作用
  10. 年过35岁的程序员都去哪儿了?