日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android自定義view實現(xiàn)滑動解鎖效果

瀏覽:78日期:2022-09-18 11:59:20

本文實例為大家分享了Android自定義view實現(xiàn)滑動解鎖的具體代碼,供大家參考,具體內(nèi)容如下

1. 需求如下:

近期需要做一個類似屏幕滑動解鎖的功能,右劃開始,左劃暫停。

2. 需求效果圖如下

Android自定義view實現(xiàn)滑動解鎖效果

3. 實現(xiàn)效果展示

Android自定義view實現(xiàn)滑動解鎖效果

4. 自定義view如下

/** * Desc 自定義滑動解鎖View * Author ZY * Mail sunnyfor98@gmail.com * Date 2021/5/17 11:52 */@SuppressLint('ClickableViewAccessibility')class SlideSwitchButton : ViewGroup { constructor(context: Context?) : this(context, null) constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0) constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : this(context,attrs,defStyleAttr, 0 ) constructor(context: Context?,attrs: AttributeSet?,defStyleAttr: Int,defStyleRes: Int ) : super(context, attrs, defStyleAttr, defStyleRes) var duration = 300 var isOpen = false var scrollView: ScrollView? = null var onSwitchListener: ((isOpen: Boolean) -> Unit)? = null private var itemHeight = 0 private var itemPadding = 0 private var parentWidth = 0 private val stopImgView: ImageView by lazy {ImageView(context).apply { setImageResource(R.drawable.f1_svg_btn_stop)} } private val startImgView: ImageView by lazy {ImageView(context).apply { setImageResource(R.drawable.f1_svg_btn_start)} } private val hintView: TextView by lazy {TextView(context).apply { setTextSize(TypedValue.COMPLEX_UNIT_PX, resources.getDimension(R.dimen.dp_14)) compoundDrawablePadding = resources.getDimension(R.dimen.dp_5).toInt() setTextColor(Color.parseColor('#727b9f'))} } init {setBackgroundResource(R.drawable.f1_sel_bg_slide_btn)addView(hintView)updateHint()addView(stopImgView)addView(startImgView)var x = 0startImgView.setOnTouchListener { v, event -> when (event.action) {MotionEvent.ACTION_DOWN -> { scrollView?.requestDisallowInterceptTouchEvent(true) x = event.x.toInt()}MotionEvent.ACTION_UP -> { if (startImgView.x < (parentWidth - startImgView.width) / 2) {play(false) } else {play(true) } scrollView?.requestDisallowInterceptTouchEvent(false)}MotionEvent.ACTION_MOVE -> { val lastX = event.x - x if (startImgView.x + lastX > parentWidth - itemPadding - startImgView.width) {return@setOnTouchListener true } if (startImgView.x + lastX < itemPadding) {return@setOnTouchListener true } startImgView.x += lastX} } return@setOnTouchListener true} } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)setMeasuredDimension(widthMeasureSpec, resources.getDimension(R.dimen.dp_90).toInt())itemPadding = resources.getDimension(R.dimen.dp_5).toInt()itemHeight = resources.getDimension(R.dimen.dp_80).toInt()parentWidth = MeasureSpec.getSize(widthMeasureSpec) } override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {stopImgView.layout( itemPadding, itemPadding, itemPadding + itemHeight, itemPadding + itemHeight)startImgView.layout( itemPadding, itemPadding, itemPadding + itemHeight, itemPadding + itemHeight)val len = hintView.paint.measureText(hintView.text.toString()) + resources.getDimension(R.dimen.dp_24)val let = (r - len) / 2hintView.layout( let.toInt(), resources.getDimension(R.dimen.dp_35).toInt(), (let + len).toInt(), resources.getDimension(R.dimen.dp_55).toInt()) } /** * flag tue為開始 false為停止 */ private fun play(flag: Boolean) {val mStart = startImgView.xval mEnd = if (flag) { parentWidth - itemPadding * 2 - startImgView.width.toFloat()} else { stopImgView.x - itemPadding}val animatorOBJ = ObjectAnimator.ofFloat(startImgView, 'translationX', mStart, mEnd)animatorOBJ.duration = duration.toLong()animatorOBJ.addListener(object : Animator.AnimatorListener { override fun onAnimationRepeat(animation: Animator?) { } override fun onAnimationEnd(animation: Animator?) {updateHint(flag)if (flag != isOpen) { isOpen = flag onSwitchListener?.invoke(flag)} } override fun onAnimationCancel(animation: Animator?) { } override fun onAnimationStart(animation: Animator?) { }})animatorOBJ.start() } private fun updateHint(lock: Boolean = false) {val icon = if (lock) { hintView.text = '滑動停止' ResourcesCompat.getDrawable(resources, R.drawable.f1_svg_left_arrow, null)} else { hintView.text = '滑動開始' ResourcesCompat.getDrawable(resources, R.drawable.f1_svg_right_arrow, null)}icon?.setBounds( 0, 0, resources.getDimension(R.dimen.dp_14).toInt(), resources.getDimension(R.dimen.dp_12).toInt())if (lock) { hintView.setCompoundDrawables(icon, null, null, null)} else { hintView.setCompoundDrawables(null, null, icon, null)} } fun stop() {play(false) } fun start() {play(true) }}

這里需要注意一點:頁面過長時,ScrollView和SlideSwitchButton滑動事件會沖突,所以需要吧scrollView傳進來

5. 調(diào)用方式如下

/** * Desc 自定義滑動解鎖View * Author ZY * Mail sunnyfor98@gmail.com * Date 2021/5/28 17:48 */class SlideSwitchButtonActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.f1_act_main)btn_start.scrollView = scrollViewbtn_start.onSwitchListener = { if (it) {Toast.makeText(this,'開始操作',Toast.LENGTH_LONG).show()btn_start.start() } else {Toast.makeText(this,'停止操作',Toast.LENGTH_LONG).show()btn_start.stop() }} }}

之前封裝了一版ZyFrame框架,集工具類、自定義組件、網(wǎng)絡請求框架一體,感覺用起來有些厚重,接下來會抽時間做拆分,ZyFrame保留網(wǎng)絡請求功能,ZyUI專做自定義組件,ZyTool專做工具類,大概就這樣。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产免费久久| av不卡免费看| 久久亚洲人体| 午夜精品亚洲| 久久精品国产999大香线蕉| 亚洲欧美高清| 国产成人精品亚洲线观看| 鲁大师影院一区二区三区| 国产一区国产二区国产三区| 视频一区二区三区在线| 久久精品人人| 日韩av二区在线播放| 亚洲福利国产| 久久久男人天堂| 久久三级中文| 最新亚洲国产| 在线日韩av| 亚洲精品88| 国产偷自视频区视频一区二区| 久久精品资源| 国产激情精品一区二区三区| 亚州av一区| 亚洲免费专区| 亚洲欧洲美洲国产香蕉| 少妇精品久久久一区二区| 99成人在线| 亚洲欧美不卡| 国产一级一区二区| 在线一区欧美| 日韩一区二区三区在线看| 红桃视频欧美| 午夜国产精品视频免费体验区| 亚洲精品极品少妇16p| 日韩一区二区三区精品视频第3页| 精品资源在线| 久久视频一区| 久久av中文| 在线综合欧美| 国产精品久久久久久妇女| 日韩成人综合| 国产视频网站一区二区三区| 日韩中文欧美| 97久久超碰| 亚洲91久久| 奇米777国产一区国产二区| 成人亚洲一区二区| 蜜桃视频一区二区三区在线观看| 精品国产美女a久久9999| 免费在线观看视频一区| 国产精品高颜值在线观看| 中文字幕日韩欧美精品高清在线| 国产精品多人| 视频一区二区中文字幕| 日韩精品水蜜桃| 亚洲国内欧美| 91综合网人人| 国产精品亚洲欧美一级在线| 午夜视频精品| av一区在线| 免费一级欧美片在线观看网站| 久久一级电影| 国产一区二区三区探花| 亚洲免费婷婷| 国产综合婷婷| 久久久久国产精品一区二区| 精品一区二区三区免费看| 欧美久久亚洲| 国产日韩免费| 国产日韩免费| 91精品国产经典在线观看| 美美哒免费高清在线观看视频一区二区| 国产成人免费| 一区二区小说| 噜噜噜久久亚洲精品国产品小说| 亚洲小说春色综合另类电影| 成人影视亚洲图片在线| 久久亚洲道色| 国产高潮在线| 免费高潮视频95在线观看网站| 高清一区二区| 久久精品亚洲人成影院 | 免费成人网www| 日韩欧美自拍| 久久亚洲国产| 超级白嫩亚洲国产第一| 国产传媒在线观看| 欧美精品日日操| 中文一区二区| 日韩中文字幕视频网| 亚洲视频播放| 欧美久久久网站| 亚洲精品成人一区| 久久一区亚洲| 国精品产品一区| 九一精品国产| 国产亚洲人成a在线v网站| 亚洲午夜久久久久久尤物| 视频在线观看国产精品| 国产精品精品国产一区二区| 日本少妇精品亚洲第一区| 美腿丝袜亚洲三区| 日韩国产欧美视频| av不卡免费看| 免费看久久久| 天堂а√在线最新版中文在线| 99视频一区| 久久人人99| 91精品麻豆| 在线亚洲精品| 久久亚洲美女| 红桃视频欧美| av综合电影网站| 天堂va欧美ⅴa亚洲va一国产| 国产精品欧美三级在线观看 | 国产精品777777在线播放| 四虎在线精品| 亚洲高清二区| 亚洲精品日本| 精品久久视频| 亚洲国产不卡| 国产精品久久久久av电视剧| 国产九一精品| 国产日本亚洲| 欧美日韩国产一区二区在线观看| 亚洲二区三区不卡| 一区二区亚洲视频| 成人一区而且| 在线精品观看| 麻豆视频久久| 免播放器亚洲| 麻豆视频一区| 亚洲乱码久久| 播放一区二区| 国产日韩欧美一区| 国产视频一区欧美| 精品免费在线| 国产亚洲一区| 免费国产亚洲视频| 日本在线啊啊| 国产欧美在线观看免费| 99pao成人国产永久免费视频| 国产精品久久久久av蜜臀| 国产午夜精品一区二区三区欧美 | 国产精品久久久久77777丨| 嫩呦国产一区二区三区av| 色天使综合视频| 日本aⅴ精品一区二区三区| 成人在线免费观看91| 久久天堂成人| 欧美国产极品| 国产精品三上| 国产精品一区二区精品| 欧美色图一区| 日本一区二区三区中文字幕| 国内精品亚洲| 免费在线观看不卡| 色乱码一区二区三区网站| 亚洲深夜福利在线观看| 久久精品欧洲| 美女av在线免费看| 日韩高清在线观看一区二区| 日本一区二区免费高清| 91久久视频| 久久精品国产福利| 亚洲小说春色综合另类电影| 水蜜桃精品av一区二区| 亚洲精品观看| 久久福利影视| 亚洲激情国产| 亚洲伊人av| 久久男人天堂| 精品国产乱码| 国产精品久久久久久久久久妞妞| 免费观看久久久4p| 视频一区在线视频| 欧美精品黄色| 国产综合激情| 亚洲国产一区二区三区在线播放| 国产一区二区三区久久| 国产精品九九| 欧美永久精品| 国产精品亚洲四区在线观看| 九九久久国产| 国内精品亚洲| 国产在线视频欧美一区| 精品国产亚洲一区二区在线观看| 国产精品13p| 香蕉精品久久| 日韩亚洲在线| 蜜桃av一区二区三区电影| 日本不卡的三区四区五区| 欧美永久精品| 国产成人精品三级高清久久91| 韩国精品主播一区二区在线观看 | 夜久久久久久| 国产精品老牛| 日韩国产成人精品| 欧美韩日一区| 欧美午夜不卡影院在线观看完整版免费| 国产一区二区高清|