【问题标题】:onClickListener not working, when overriding onTouchEvent in custom View在自定义视图中覆盖 onTouchEvent 时,onClickListener 不起作用
【发布时间】:2018-11-30 14:22:41
【问题描述】:

我想在单击按钮时开始画线,当我将鼠标悬停在另一个按钮上时结束画线。我已经覆盖了 onTouchEvent 来绘制这条线,但问题是现在 onTouchListener 甚至没有触发。将 newView 移至背景使其工作,但我希望画线位于前景。我认为问题在于,当我从代码中添加视图时,newView 的 onTouchEvent 比另一个 ViewGroup 中的 Button 具有某种优先级。 Component Tree,在frameLayout1中添加了newView

class MainActivity : AppCompatActivity() {

    private val paint = Paint()
    private val array1 = FloatArray(2)
    private val array2 = FloatArray(2)
    private var buttonwidth = 0;
    private var buttonheight=0;
    private var buttonIsTouched=false
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main);
        button1.setOnTouchListener { _, event ->
            if (event.action == MotionEvent.ACTION_DOWN) {
                buttonIsTouched=true
                Toast.makeText(this,"ora",Toast.LENGTH_SHORT).show()
            }
            if (event.action == MotionEvent.ACTION_UP) {
                buttonIsTouched=false
                Toast.makeText(this,"muda",Toast.LENGTH_SHORT).show()
            }
            false
        }

    }

    override fun onResume() {
        super.onResume()

        buttonwidth = button1.width;
        buttonheight = button1.height;
        array1[0]=button1.x
        array1[1]=button1.y
        array2[0]=button2.x
        array2[1]=button2.y
        val newView = MyView(this)
        newView.bringToFront()
        newView.layoutParams= FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.MATCH_PARENT)
        frameLayout1.addView(newView)
        Toast.makeText(this,array1[0].toString()+" "+array1[1].toString(),Toast.LENGTH_SHORT).show()

    }

    internal inner class MyView(context: Context)// TODO Auto-generated constructor stub
        : View(context) {
        private var startX: Int = 0
        private var startY: Int = 0
        private var endX: Int = 0
        private var endY: Int = 0
        override fun onDraw(canvas: Canvas) {

            super.onDraw(canvas)
            paint.strokeWidth=21f
            paint.color = Color.parseColor("#CD5C5C")
            //canvas.drawLine(array1[0]+20f+buttonwidth/2,array1[1]+20f+buttonheight/2,array2[0]+20f+buttonwidth/2,array2[1]+20f+buttonheight/2,paint)
            canvas.drawLine(startX.toFloat(),startY.toFloat(),endX.toFloat(),endY.toFloat(),paint)
        }

        override fun onTouchEvent(event: MotionEvent): Boolean {
            super.onTouchEvent(event)
                when (event.action) {
                    MotionEvent.ACTION_DOWN -> {
                        startX = event.x.toInt()
                        startY = event.y.toInt()
                        endX = event.x.toInt()
                        endY = event.y.toInt()
                        invalidate()
                    }
                    MotionEvent.ACTION_MOVE -> {
                        endX = event.x.toInt()
                        endY = event.y.toInt()
                        invalidate()
                    }
                    MotionEvent.ACTION_UP -> {
                        endX = event.x.toInt()
                        endY = event.y.toInt()
                        invalidate()

                    }
                }

            return true

        }
    }

}

【问题讨论】:

  • button1MyView 的实例吗?什么不叫:button1.onTouchListener 或 MyView.onTouchEvent?
  • button1 是 Button 的实例。 MyView.onTouchEvent 被调用,但是 button1.onTouchListener 没有被调用,甚至按钮动画都不会触发。

标签: android kotlin android-custom-view android-touch-event


【解决方案1】:

你没有在之后引用按钮

setContentView(R.layout.activity_main)

喜欢

button1 = findViewById(R.id.btn1)

【讨论】:

  • 我在用kotlin,还用吗?
  • 是的,你应该在访问它之前引用它,即使它是 kotlin。如果您使用的是黄油刀等 3rd 方库,则没有必要。
  • @Raj 如果 OP 使用 kotlin 扩展,这可能是错误的。 kotlin android 扩展会自动添加到项目中,这意味着您不必显式地 findViewById 获取视图。
  • 另外,如果 button1 没有被初始化,它会在 setOnClickListener 调用时抛出 NullPointerException。
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 2011-08-13
相关资源
最近更新 更多