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

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

Android自定義view實現滑動解鎖效果

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

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

1. 需求如下:

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

2. 需求效果圖如下

Android自定義view實現滑動解鎖效果

3. 實現效果展示

Android自定義view實現滑動解鎖效果

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. 調用方式如下

/** * 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框架,集工具類、自定義組件、網絡請求框架一體,感覺用起來有些厚重,接下來會抽時間做拆分,ZyFrame保留網絡請求功能,ZyUI專做自定義組件,ZyTool專做工具類,大概就這樣。

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

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产99久久久国产精品成人免费| 久久精品国产www456c0m| 欧美特黄一级| 激情91久久| 国产亚洲一区在线| 亚洲在线国产日韩欧美| 久久夜色精品| 亚洲精品伊人| 久久国内精品视频| 日韩影院精彩在线| 亚洲精品精选| 国产日韩欧美一区二区三区 | 精品一区视频| 福利在线免费视频| 色爱综合av| 国产亚洲综合精品| 亚洲乱码视频| 国产精品天堂蜜av在线播放| 精品午夜视频| 欧美日韩在线网站| 热久久免费视频| 欧美中文一区| 久久精品五月| 亚洲成人不卡| 亚洲在线观看| 国产精一区二区| 亚洲精品福利电影| 99热免费精品| 国产亚洲一区二区三区不卡| 久久精品免视看国产成人| 日韩中文视频| 蜜桃一区二区三区在线观看| 青青伊人久久| 97精品国产| 久久亚洲国产精品一区二区| 国产亚洲一区二区三区啪| 91欧美在线| 丝袜诱惑制服诱惑色一区在线观看| 亚洲ab电影| 牛牛精品成人免费视频| 久久久久99| 亚洲精品综合| 久久三级毛片| 欧美特黄a级高清免费大片a级| 日本不卡的三区四区五区| 精品欧美日韩精品| 最新日韩av| 国产精品免费不| 国产精品av一区二区| 日本成人精品| 久久夜夜操妹子| 日韩精品电影一区亚洲| 日韩av在线中文字幕| 免费欧美一区| 国产精品美女久久久久久不卡| 亚洲国产专区校园欧美| 青青草91久久久久久久久| 蜜桃av.网站在线观看| 中文字幕日本一区二区| 中文字幕在线官网| 亚洲欧洲国产精品一区| 日韩欧美三级| 日韩精品一级| 亚洲国产专区校园欧美| 欧美激情一区| 视频一区在线播放| 激情黄产视频在线免费观看| 亚洲免费福利一区| 91亚洲国产成人久久精品| 男女男精品网站| 黄毛片在线观看| 欧美日韩亚洲一区在线观看| 亚洲调教视频在线观看| 免费亚洲婷婷| 午夜视频一区二区在线观看| 亚洲va中文在线播放免费| 91亚洲无吗| 99国产精品| av综合电影网站| 国产欧美啪啪| 日韩中文字幕麻豆| 久久国产精品成人免费观看的软件| 欧美另类中文字幕| 好看的亚洲午夜视频在线| 国产一区二区三区视频在线| 日韩在线观看中文字幕| 午夜久久tv| 日韩三区在线| 精品美女在线视频| 国产亚洲精品精品国产亚洲综合| 亚洲国产综合在线看不卡| 精品国产午夜肉伦伦影院| 久久精品99国产精品| 中文字幕一区日韩精品| 日韩午夜高潮| 久久精品青草| 亚洲欧洲美洲av| 精品三级在线观看视频| 国产日产一区| 日韩精品亚洲专区在线观看| 久久国产精品亚洲77777| 欧美一区二区三区激情视频| jizzjizz中国精品麻豆| 久久99蜜桃| 欧美日本精品| 88久久精品| 日韩精选在线| 日韩欧美激情| 日韩有码av| 免费人成网站在线观看欧美高清| 91精品亚洲| 亚洲人成在线网站| 日韩精品一区二区三区中文| 亚洲欧美视频| 男人的天堂久久精品| 日韩美女国产精品| 国产精品腿扒开做爽爽爽挤奶网站| 日本欧美国产| 婷婷色综合网| 日韩一区二区三区在线免费观看| 久久国产人妖系列| 日本综合视频| 国产精品免费精品自在线观看| 国产劲爆久久| 日本色综合中文字幕| 中文字幕成人| 香蕉久久一区| 黄色精品视频| 日韩不卡免费高清视频| 日本亚洲最大的色成网站www| 成人在线视频中文字幕| 欧美日韩国产一区精品一区| 精品一区91| 午夜精品影院| 亚洲性视频h| 日韩av一区二| 国产99久久| 欧美国产视频| 国产欧美日韩一区二区三区在线| 成人欧美一区二区三区的电影| 亚洲欧美久久| 国产精品成人a在线观看| 亚洲欧美日韩视频二区| 久久久久久网| 日韩视频一区二区三区在线播放免费观看| 亚洲免费观看高清完整版在线观| 99国产精品久久久久久久| 亚洲精品第一| 精品中文字幕一区二区三区av| 欧美亚洲免费| 亚洲午夜电影| 久久精品中文| 美女久久99| 一区视频在线| 九九久久国产| 欧美日韩午夜电影网| 欧美精品激情| 午夜精品久久久久久久久久蜜桃| av高清不卡| 国产一区清纯| 美女网站视频一区| 日韩精品一区二区三区中文| 久久国产主播| 日本不卡高清视频| 99精品综合| 欧美日韩调教| 西西人体一区二区| 中文字幕在线高清| 97久久精品| 亚洲综合色婷婷在线观看| 成人黄色av| 丝袜美腿一区| 国产精品毛片一区二区三区| 岛国av在线网站| 中文字幕系列一区| 午夜av成人| 影音先锋国产精品| 88久久精品| 久久精品97| 成人日韩在线| 日韩专区视频网站| 亚洲精品国产精品粉嫩| 日日摸夜夜添夜夜添国产精品| 鲁大师成人一区二区三区| 久久国产麻豆精品| 99久久久久| 国产日韩欧美高清免费| 久久国产中文字幕| 中文字幕一区二区三区日韩精品| 国产精品一区高清| 亚洲午夜在线| 美女视频黄免费的久久| 黄色成人91| 精品国产a一区二区三区v免费| 国产精品普通话对白| 精品日本视频| 日本成人在线不卡视频| 国内精品福利| 精品资源在线| 日本一不卡视频|