Kotlin - Can I make a bitmap using canvas clickable?

138 views Asked by At

I have a zoomable ImageView, which currently includes 2 Bitmap Views (location pin image):

Image

I want the App user to click on the Bitmaps and then it should open a new Activity. But I cannot set up the right code to make each Bitmap clickable. How can I achieve this?

This is my Bitmap View "PinView", which is used in my "ExtensionPinFragment":

import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.util.Log
import android.view.MotionEvent
import android.widget.Toast
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import com.davemorrissey.labs.subscaleview.sample.R.drawable


class PinView @JvmOverloads constructor(context: Context, attr: AttributeSet? = null) : SubsamplingScaleImageView(context, attr) {

    private val paint = Paint()
    private val vPin = PointF()
    private var sPin: PointF? = null

    private val paint2 = Paint()
    private val vPin2 = PointF()
    private var sPin2: PointF? = null

    private var pin: Bitmap
    private var pin2: Bitmap

    init {
        val density = resources.displayMetrics.densityDpi.toFloat()
        val bitmap = BitmapFactory.decodeResource(this.resources, drawable.pushpin_green)
        val w = density / 420f * bitmap.width
        val h = density / 420f * bitmap.height
        pin = Bitmap.createScaledBitmap(bitmap, w.toInt(), h.toInt(), true)
        pin2 = Bitmap.createScaledBitmap(bitmap, w.toInt(), h.toInt(), true)
    }




    fun setPin(sPin: PointF) {
        this.sPin = sPin
        invalidate()
    }

    fun setPin2(sPin2: PointF) {
        this.sPin2 = sPin2
        invalidate()
    }


    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        if (sPin != null) {
            sourceToViewCoord(sPin, vPin)
            val vX = vPin.x - pin.width / 2
            val vY = vPin.y - pin.height
            canvas.drawBitmap(pin, vX, vY, paint)
        }
        if (sPin2 != null) {
            sourceToViewCoord(sPin2, vPin2)
            val vX = vPin2.x - pin2.width / 2
            val vY = vPin2.y - pin2.height
            canvas.drawBitmap(pin2, vX, vY, paint2)
        }
    }


}

In my "ExtensionPinFragment" I set up the coordinates of the Bitmap:

import android.app.Fragment
import android.graphics.PointF
import android.opengl.ETC1.getHeight
import android.opengl.ETC1.getWidth
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import com.davemorrissey.labs.subscaleview.ImageSource
import com.davemorrissey.labs.subscaleview.sample.R.layout
import kotlinx.android.synthetic.main.extension_pin_fragment.*


class ExtensionPinFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater!!.inflate(layout.extension_pin_fragment, container, false)

    }

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        imageView.setImage(ImageSource.asset("swissroad.jpg"))
        imageView.setPin(PointF(565f, 1065f))
        imageView.setPin2(PointF(165f, 1465f))
    }



}

This is my MainActivity:

import android.os.Bundle


import kotlinx.android.synthetic.main.main.*
import android.support.v7.app.AppCompatActivity
import com.davemorrissey.labs.subscaleview.sample.extension.ExtensionPinFragment

class MainActivity : AppCompatActivity() {

    private var fragmentId: Int = R.id.extension

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)
        setFragment(fragmentId)

    }

    private fun setFragment(id: Int) {
        fragmentId = id
        val fragmentClass = when(id) {
            R.id.extension -> ExtensionPinFragment::class.java
            else -> ExtensionPinFragment::class.java
        }
        val existingFragment = fragmentManager.findFragmentByTag("ROOT")
        if (existingFragment?.javaClass != fragmentClass) {
            fragmentManager.beginTransaction()
                    .replace(R.id.content, fragmentClass.newInstance(), "ROOT")
                    .commit()
        }
    }



}
0

There are 0 answers