亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android自定義view實(shí)現(xiàn)滑動(dòng)解鎖效果

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

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

1. 需求如下:

近期需要做一個(gè)類(lèi)似屏幕滑動(dòng)解鎖的功能,右劃開(kāi)始,左劃暫停。

2. 需求效果圖如下

Android自定義view實(shí)現(xiàn)滑動(dòng)解鎖效果

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

Android自定義view實(shí)現(xiàn)滑動(dòng)解鎖效果

4. 自定義view如下

/** * Desc 自定義滑動(dòng)解鎖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為開(kāi)始 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 = '滑動(dòng)停止' ResourcesCompat.getDrawable(resources, R.drawable.f1_svg_left_arrow, null)} else { hintView.text = '滑動(dòng)開(kāi)始' 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) }}

這里需要注意一點(diǎn):頁(yè)面過(guò)長(zhǎng)時(shí),ScrollView和SlideSwitchButton滑動(dòng)事件會(huì)沖突,所以需要吧scrollView傳進(jìn)來(lái)

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

/** * Desc 自定義滑動(dòng)解鎖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,'開(kāi)始操作',Toast.LENGTH_LONG).show()btn_start.start() } else {Toast.makeText(this,'停止操作',Toast.LENGTH_LONG).show()btn_start.stop() }} }}

之前封裝了一版ZyFrame框架,集工具類(lèi)、自定義組件、網(wǎng)絡(luò)請(qǐng)求框架一體,感覺(jué)用起來(lái)有些厚重,接下來(lái)會(huì)抽時(shí)間做拆分,ZyFrame保留網(wǎng)絡(luò)請(qǐng)求功能,ZyUI專(zhuān)做自定義組件,ZyTool專(zhuān)做工具類(lèi),大概就這樣。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 一线高清视频在线观看www国产 | 一级日韩一级欧美 | 亚洲美女一级毛片 | 99综合网 | 一区二区三区四区无限乱码 | 在线观影 | 香蕉免费一区二区三区在线观看 | 成人小视频在线免费观看 | 毛片a级 | 黑人好太好长爱不了 | 成人激情视频在线观看 | a级片免费在线观看 | 色片网 | 久久成人在线 | 香蕉99国内自产自拍视频 | 欧美激情一级毛片在 | 久久久久国产精品免费免费 | 美日韩在线视频 | 麻豆视频www | 午夜精品视频5000 | 亚洲综合视频一区 | 高清成人爽a毛片免费网站 高清成人综合 | 欧洲一级毛片 | 国产视频一区二 | 中文字幕一区二区三区在线播放 | 欧美一级特黄乱妇高清视频 | 久久久久激情免费观看 | 成人无遮挡毛片免费看 | 国语对白avxxxooo | 国产精品第一区第27页 | 香蕉视频免费看 | 亚洲欧美久久精品1区2区 | 国产成人毛片视频不卡在线 | 一级毛片高清 | 日产免费线路一页二页 | 日韩欧美中文字幕一区 | 九九99re在线视频精品免费 | 美国一级片在线 | 国产午夜精品一二区理论影院 | 艹逼视频免费观看 | 欧美高清另类 |