Search code examples
androidkotlinseekbar

How to get value of ssekbar.progress and use it on another function


I want to get value from seekbar.progress of three seekbar for control RGB.
I have Red seekbar , Green seekBar and Blue seekbar and I want that when I drag red seekbar and green and blue , I want to set Background for an image view that use value of seekbar . I want use this values for set background that Combination of three color .
I'm write the paint function for get three values of my seekbar and set a color for my image view background;
My SeekbarManger class is this :

class SeekBarManager()  {


}

fun seekBarManage(context: Context, seekBar: SeekBar) {



    seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {


        override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) { }

        override fun onStartTrackingTouch(p0: SeekBar?) {}

        override fun onStopTrackingTouch(p0: SeekBar?) {

            MainActivity.getSeekBarProgress(context , seekBar)
        }


    })

}


fun paint(view: View, red: Int, green:Int, blue:Int){


    fun View.getLocationOnScreen(): Point
    {
        val location = IntArray(2)
        this.getLocationOnScreen(location)
        return Point(location[0],location[1])
    }
    val location = view.getLocationOnScreen()
    val absX = location.x
    val absY = location.y

    val bitmap = Bitmap.createBitmap(absX , absY , Bitmap.Config.RGB_565)
    val canvas = Canvas(bitmap)
    canvas.drawRGB(red , green , blue )
    view.background = BitmapDrawable(view.resources , bitmap)


}

and my MainActivity is This:


open class MainActivity : AppCompatActivity()  {

    companion object {

        fun getSeekBarProgress(context: Context , seekBar: SeekBar){
            val result = seekBar.progress
            Toast.makeText(context, "Progress is: $result%", Toast.LENGTH_SHORT).show()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        val seekRed  = findViewById<SeekBar>(R.id.seekBar_red)
        val seekGreen = findViewById<SeekBar>(R.id.seekBar_green)
        val seekBlue = findViewById<SeekBar>(R.id.seekBar_blue)
        
        val seekEndRed = seekBarManage(this , seekRed)
        val seekEndGreen = seekBarManage(this , seekGreen)
        val seekEndBlue = seekBarManage(this , seekBlue)


        paint(color_output , seekEndRed , seekEndGreen , seekEndBlue)


    }


}

Solution

  • You should pass seekbars and view objects to SeekbarManager Class and then pass them to Companion object like below :

    open class MainActivity : AppCompatActivity() {
    
        companion object {
            fun getSeekBarProgress(
                seekBarRed: SeekBar,
                seekBarGreen: SeekBar,
                seekBarBlue: SeekBar,
                view: View
            ) {
                paint(view, seekBarRed.progress, seekBarGreen.progress, seekBarBlue.progress)
    
            }
    
            private fun paint(view: View, red: Int, green: Int, blue: Int) {
                fun View.getLocationOnScreen(): Point {
                    val location = IntArray(2)
                    this.getLocationOnScreen(location)
                    return Point(location[0], location[1])
                }
    
                val location = view.getLocationOnScreen()
                val absX = location.x
                val absY = location.y
    
                val bitmap = Bitmap.createBitmap(absX, absY, Bitmap.Config.RGB_565)
                val canvas = Canvas(bitmap)
                canvas.drawRGB(red, green, blue)
                view.background = BitmapDrawable(view.resources, bitmap)
            }
            
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            val colorOutput = findViewById<View>(R.id.color_output)
            val seekRed = findViewById<SeekBar>(R.id.seekBar_red)
            val seekGreen = findViewById<SeekBar>(R.id.seekBar_green)
            val seekBlue = findViewById<SeekBar>(R.id.seekBar_blue)
            
            seekBarManage(seekRed, seekGreen, seekBlue, colorOutput)
            
        }
    
    
    }
    

    and

    class SeekBarManager() {
    
    
    }
    
    fun seekBarManage(
        seekBarRed: SeekBar,
        seekBarGreen: SeekBar,
        seekBarBlue: SeekBar,
        view: View
    ) {
    
    
        seekBarRed.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
    
    
            override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {}
    
            override fun onStartTrackingTouch(p0: SeekBar?) {}
    
            override fun onStopTrackingTouch(p0: SeekBar?) {
    
                MainActivity.getSeekBarProgress(seekBarRed, seekBarGreen, seekBarBlue, view)
            }
    
    
        })
    
        seekBarGreen.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
    
    
            override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {}
    
            override fun onStartTrackingTouch(p0: SeekBar?) {}
    
            override fun onStopTrackingTouch(p0: SeekBar?) {
    
                MainActivity.getSeekBarProgress(seekBarRed, seekBarGreen, seekBarBlue, view)
            }
    
    
        })
    
        seekBarBlue.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
    
    
            override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {}
    
            override fun onStartTrackingTouch(p0: SeekBar?) {}
    
            override fun onStopTrackingTouch(p0: SeekBar?) {
    
                MainActivity.getSeekBarProgress(seekBarRed, seekBarGreen, seekBarBlue, view)
            }
    
    
        })
    
    }
    

    and better way is to just do all these in MainActivity and there is no need for SeekBarManager Class, like below:

    open class MainActivity : AppCompatActivity() {
        lateinit var colorOutput: View
        lateinit var seekRed: SeekBar
        lateinit var seekGreen: SeekBar
        lateinit var seekBlue: SeekBar
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            colorOutput = findViewById<View>(R.id.color_output)
            seekRed = findViewById<SeekBar>(R.id.seekBar_red)
            seekGreen = findViewById<SeekBar>(R.id.seekBar_green)
            seekBlue = findViewById<SeekBar>(R.id.seekBar_blue)
    
            seekRed.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
    
    
                override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {}
    
                override fun onStartTrackingTouch(p0: SeekBar?) {}
    
                override fun onStopTrackingTouch(p0: SeekBar?) {
    
                    paint()
                }
    
    
            })
    
            seekGreen.setOnSeekBarChangeListener(
                object : SeekBar.OnSeekBarChangeListener {
    
    
                    override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {}
    
                    override fun onStartTrackingTouch(p0: SeekBar?) {}
    
                    override fun onStopTrackingTouch(p0: SeekBar?) {
    
                        paint()
                    }
    
    
                })
    
            seekBlue.setOnSeekBarChangeListener(
                object : SeekBar.OnSeekBarChangeListener {
    
    
                    override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {}
    
                    override fun onStartTrackingTouch(p0: SeekBar?) {}
    
                    override fun onStopTrackingTouch(p0: SeekBar?) {
    
                        paint()
                    }
    
    
                })
        }
    
    
        private fun paint() {
            val view = colorOutput
            val red = seekRed.progress
            val green = seekGreen.progress
            val blue = seekBlue.progress
            fun View.getLocationOnScreen(): Point {
                val location = IntArray(2)
                this.getLocationOnScreen(location)
                return Point(location[0], location[1])
            }
    
            val location = view.getLocationOnScreen()
            val absX = location.x
            val absY = location.y
    
            val bitmap = Bitmap.createBitmap(absX, absY, Bitmap.Config.RGB_565)
            val canvas = Canvas(bitmap)
            canvas.drawRGB(red, green, blue)
            view.background = BitmapDrawable(view.resources, bitmap)
        }
    }