11package com.pizzk.overlay.app
22
3+ import android.graphics.Color
34import androidx.appcompat.app.AppCompatActivity
45import android.os.Bundle
56import android.view.View
6- import android.widget.Toast
7+ import android.view.ViewGroup
78import androidx.constraintlayout.widget.ConstraintSet
9+ import androidx.recyclerview.widget.LinearLayoutManager
10+ import androidx.recyclerview.widget.RecyclerView
811import com.pizzk.overlay.*
912import com.pizzk.overlay.el.Anchor
1013import com.pizzk.overlay.el.Marker
@@ -16,30 +19,32 @@ class MainActivity : AppCompatActivity() {
1619 override fun onCreate (savedInstanceState : Bundle ? ) {
1720 super .onCreate(savedInstanceState)
1821 setContentView(R .layout.activity_main)
22+ val rv: RecyclerView = findViewById(R .id.vRecycler)
23+ rv.layoutManager = LinearLayoutManager (baseContext)
24+ rv.adapter = ListAdapter ()
25+ //
1926 val vOverlay: OverlayLayout = findViewById(R .id.vOverlay)
2027 vOverlay.setMaskColor(R .color.overlay_mask)
2128 vOverlay.setVisibility(false )
2229 adapter.with (vOverlay)
2330 findViewById<View >(R .id.tv1).setOnClickListener {
24- Toast .makeText(baseContext, " TV1 clicked" , Toast .LENGTH_SHORT ).show()
2531 buildMultiOverlay()
2632 adapter.next()
2733 }
2834 findViewById<View >(R .id.tv2).setOnClickListener {
29- Toast .makeText(baseContext, " TV2 clicked" , Toast .LENGTH_SHORT ).show()
3035 buildMultiAnchor()
3136 adapter.next()
3237 }
3338 }
3439
3540 private fun buildMultiOverlay () {
3641 val overlay1 = Overlay .Builder ()
37- .anchor(Anchor .rect(R .id.tv1, radius = 10 , inset = 10 ))
42+ .anchor(Anchor .rect(R .id.tv1, radius = 10 , outset = 10 ))
3843 .marker(R .layout.tv1_marker)
3944 .build()
4045 overlay1.marker(R .layout.tv1_marker, m1Layout)
4146 val overlay2 = Overlay .Builder ()
42- .anchor(Anchor .circle(R .id.tv2, inset = 30 ))
47+ .anchor(Anchor .circle(R .id.tv2, outset = 30 ))
4348 .marker(R .layout.tv2_marker)
4449 .build()
4550 overlay2.marker(R .layout.tv2_marker, m2Layout)
@@ -48,14 +53,23 @@ class MainActivity : AppCompatActivity() {
4853
4954 private fun buildMultiAnchor () {
5055 val overlay = Overlay .Builder ()
51- .anchor(Anchor .rect(R .id.tv1, radius = 10 , inset = 5 ))
56+ .anchor(Anchor .rect(R .id.tv1, radius = 10 , outset = 5 ))
5257 .marker(R .layout.tv1_marker)
53- .anchor(Anchor .circle(R .id.tv2, inset = 20 ))
58+ .anchor(Anchor .circle(R .id.tv2, outset = 20 ))
5459 .marker(R .layout.tv2_marker)
60+ //
61+ .anchor(Anchor .rect(R .id.vRecycler, radius = 10 , outset = 5 ))
5562 .build()
5663 overlay.marker(R .layout.tv1_marker, m1Layout)
5764 overlay.marker(R .layout.tv2_marker, m2Layout)
58- adapter.overlays(listOf (overlay))
65+ // 特殊情况:从RecyclerView中获取定位子元素,不能使用使用常规的findViewById
66+ overlay.anchor(R .id.vRecycler, object : Anchor .Find {
67+ override fun onFind (parent : ViewGroup , id : Int ): View ? {
68+ val v: ViewGroup ? = findViewById(id)
69+ return v?.getChildAt(2 )
70+ }
71+ })
72+ adapter.overlays(overlay)
5973 }
6074
6175 private val m1Layout: Marker .MarkerLayout = object : Marker .MarkerLayout () {
@@ -77,4 +91,21 @@ class MainActivity : AppCompatActivity() {
7791 setParentClickListener { adapter.next() }
7892 }
7993 }
94+
95+ private class ListAdapter : RecyclerView .Adapter <RecyclerView .ViewHolder >() {
96+ private val colors: List <Int > = listOf (Color .RED , Color .GREEN , Color .BLUE )
97+
98+ override fun onCreateViewHolder (parent : ViewGroup , viewType : Int ): RecyclerView .ViewHolder {
99+ val v = View (parent.context)
100+ val lp = ViewGroup .LayoutParams (ViewGroup .LayoutParams .MATCH_PARENT , 200 )
101+ v.layoutParams = lp
102+ return object : RecyclerView .ViewHolder (v) {}
103+ }
104+
105+ override fun onBindViewHolder (holder : RecyclerView .ViewHolder , position : Int ) {
106+ holder.itemView.setBackgroundColor(colors[position % colors.size])
107+ }
108+
109+ override fun getItemCount (): Int = 4
110+ }
80111}
0 commit comments