国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

android開(kāi)發(fā)之Android 自定義滑動(dòng)解鎖View

這篇具有很好參考價(jià)值的文章主要介紹了android開(kāi)發(fā)之Android 自定義滑動(dòng)解鎖View。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

自定義滑動(dòng)解鎖View

  1. 需求如下:

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

  1. 需求效果圖如下
    android開(kāi)發(fā)之Android 自定義滑動(dòng)解鎖View,IT,程序員,android
  2. 實(shí)現(xiàn)效果展示
    android開(kāi)發(fā)之Android 自定義滑動(dòng)解鎖View,IT,程序員,android
  3. 自定義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 = 0

    startImgView.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) / 2

    hintView.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.x

    val 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)

  1. 調(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 = scrollView

    btn_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框架,集工具類、自定義組件、網(wǎng)絡(luò)請(qǐng)求框架一體,感覺(jué)用起來(lái)有些厚重,接下來(lái)會(huì)抽時(shí)間做拆分,ZyFrame保留網(wǎng)絡(luò)請(qǐng)求功能,ZyUI專做自定義組件,ZyTool專做工具類,大概就這樣。

文章來(lái)源:網(wǎng)絡(luò) 版權(quán)歸原作者所有

上文內(nèi)容不用于商業(yè)目的,如涉及知識(shí)產(chǎn)權(quán)問(wèn)題,請(qǐng)權(quán)利人聯(lián)系小編,我們將立即處理文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-637908.html

到了這里,關(guān)于android開(kāi)發(fā)之Android 自定義滑動(dòng)解鎖View的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android自定義View流程

    在開(kāi)發(fā)中,View視圖具有非常重要的作用,它是直接呈現(xiàn)給使用者的,因此向用戶展示精美高效的View視圖很有意義。Android系統(tǒng)提供了豐富的視圖組件,如TextView、ImageView、Button等,還提供了RelativeLayout、LinearLayout、FrameLayout等組合組件,使用這些組件搭配能實(shí)現(xiàn)良好的視圖效果

    2024年04月11日
    瀏覽(17)
  • Android 自定義View 之 圓環(huán)進(jìn)度條

    Android 自定義View 之 圓環(huán)進(jìn)度條

    ??很多時(shí)候我們會(huì)使用進(jìn)度條,而Android默認(rèn)的進(jìn)度條是長(zhǎng)條的,從左至右。而在日常開(kāi)發(fā)中,有時(shí)候UI為了讓頁(yè)面更美觀,就需要用到圓環(huán)進(jìn)度條,那么本文就是通過(guò)自定義寫(xiě)一個(gè)圓環(huán)進(jìn)度條,首先看一下效果圖: ??關(guān)于自定義View的基礎(chǔ)知識(shí)就不再做過(guò)多的講解了,我

    2024年02月10日
    瀏覽(18)
  • Android:繪制自定義View人臉識(shí)別框

    Android:繪制自定義View人臉識(shí)別框

    項(xiàng)目開(kāi)發(fā)需要自定義View實(shí)現(xiàn)一個(gè)人臉框,代碼實(shí)現(xiàn)很平常,一些細(xì)節(jié)記錄一下,方便以后查閱。 代碼實(shí)現(xiàn): FaceView.java 注意: 這里我把FaceView的layout_width、layout_height都設(shè)置成了\\\"match_parent\\\" 這里面有個(gè) 坑 容易踩到 本次開(kāi)發(fā)時(shí),xml中FaceView控件往上一直到第一層父布局寬、高

    2024年02月09日
    瀏覽(21)
  • Android 自定義View 之 Dialog彈窗

    Android 自定義View 之 Dialog彈窗

    ??在日常開(kāi)發(fā)中用到彈窗是比較多的,常用于提示作用,比如錯(cuò)誤操作提示,余額不足提示,退出登錄提示等,還有用于數(shù)據(jù)展示的彈窗,上拉彈窗等等,主要為了簡(jiǎn)化在日常開(kāi)發(fā)中的使用。 ??Android中的Dialog彈窗是一種用于展示特定信息或者在用戶需要進(jìn)行某些操作時(shí)

    2024年02月16日
    瀏覽(23)
  • Android 自定義View之圓形進(jìn)度條

    Android 自定義View之圓形進(jìn)度條

    很多場(chǎng)景下都用到這種進(jìn)度條,有的還帶動(dòng)畫(huà)效果, 今天我也來(lái)寫(xiě)一個(gè)。 寫(xiě)之前先拆解下它的組成: 底層圓形 上層弧形 中間文字 那我們要做的就是: 繪制底層圓形; 在同位置繪制上層弧形,但顏色不同; 在中心點(diǎn)繪制文本,顯示進(jìn)度。 按照這個(gè)目標(biāo),學(xué)習(xí)下自定義Vi

    2024年02月09日
    瀏覽(23)
  • Android自定義View之游戲搖桿鍵盤(pán)實(shí)現(xiàn)(一),快手android面試經(jīng)驗(yàn)

    Android自定義View之游戲搖桿鍵盤(pán)實(shí)現(xiàn)(一),快手android面試經(jīng)驗(yàn)

    public class RemoteViewBg { private Bitmap bitmapBg; public RemoteViewBg(Bitmap bitmap) { bitmapBg = bitmap; } //背景的繪圖函數(shù) public void draw(Canvas canvas, Paint paint, Rect src0 ,Rect dst0 ) { canvas.drawBitmap(bitmapBg, src0, dst0, paint); } } 重寫(xiě)系統(tǒng)的觸摸時(shí)間,判斷觸摸點(diǎn)在背景范圍內(nèi)還是背景范圍外 @Override public b

    2024年04月12日
    瀏覽(17)
  • Android 滑動(dòng)按鈕(開(kāi)關(guān)) SwitchCompat 自定義風(fēng)格

    Android 滑動(dòng)按鈕(開(kāi)關(guān)) SwitchCompat 自定義風(fēng)格

    原生的SwitchCompat控件如下圖,不說(shuō)不堪入目,也算是不敢恭維了。開(kāi)個(gè)玩笑... 所以我們就需要對(duì)SwitchCompat進(jìn)行自定義風(fēng)格,效果如下圖 代碼如下 從上面的xml代碼來(lái)看其實(shí)只需要定制兩個(gè)東西一個(gè)是thumb,另一個(gè)是track switch_thumb switch_track_style switch_track_style里面有兩個(gè)背景如下

    2024年02月03日
    瀏覽(16)
  • [Android]自定義RecyclerView中View的動(dòng)畫(huà)

    官方有一個(gè)默認(rèn)Item動(dòng)畫(huà)類DafaultItemAnimator,其中 DefaultItemAnimator 繼承了SimpleItemAnimator 繼承了 RecyclerView.ItemAnimator SimpleItemAnimator 它是一個(gè)包裝類,用來(lái)判斷當(dāng)前的ViewHolder到底是執(zhí)行移動(dòng)、移除、添加或者改變等行為。 DefaultItemAnimator 是執(zhí)行具體動(dòng)畫(huà)類,它負(fù)責(zé)將viewHolder初始化

    2024年02月11日
    瀏覽(20)
  • Android 滑動(dòng)條、Slider、Seekbar深度自定義

    Android 滑動(dòng)條、Slider、Seekbar深度自定義

    為了更好的滿足日常開(kāi)發(fā)中對(duì)Slider控件的各種需要,以下我們來(lái)看下基于nifty-slider來(lái)定制我們所需的各種功能及交互效果 支持滑動(dòng)條起始值結(jié)束值的自定義 支持滑動(dòng)條指定步長(zhǎng)以實(shí)現(xiàn)類似刻度的功能 支持對(duì)滑塊的自定義以添加光環(huán)效果、滑塊形狀,滑塊投影、滑塊邊框、滑

    2024年02月12日
    瀏覽(29)
  • Android自定義View之游戲搖桿鍵盤(pán)實(shí)現(xiàn)(一)

    Android自定義View之游戲搖桿鍵盤(pán)實(shí)現(xiàn)(一)

    public class RemoteViewBg { private Bitmap bitmapBg; public RemoteViewBg(Bitmap bitmap) { bitmapBg = bitmap; } //背景的繪圖函數(shù) public void draw(Canvas canvas, Paint paint, Rect src0 ,Rect dst0 ) { canvas.drawBitmap(bitmapBg, src0, dst0, paint); } } 重寫(xiě)系統(tǒng)的觸摸時(shí)間,判斷觸摸點(diǎn)在背景范圍內(nèi)還是背景范圍外 @Override public b

    2024年04月17日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包