Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Кастомная кнопка с нестандартной зоной нажатия

#android #android_button #android_customview


Как сделать такую кнопку?


Нажатие необходимо фиксировать в зоне до кривой линии. 

Нашел в стандартных View - ImageButton, но там зона нажатия прямоугольная, что не
подходит для моей задачи.
    


Ответы

Ответ 1



Можно переопределить onTouchListener и придумать способ определять, попал клик в область или нет. То, что нарисовано, похоже на дугу, поэтому я бы написал так: public class MyCutomView extends TextView { // constructors will be here float radiusSquare; OnClickListener myListener; @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); radiusSquare = (float) Math.pow(Math.max(w, h), 2); } @Override public boolean onTouchEvent(MotionEvent event) { float viewX = event.getX(); float viewY = event.getY(); // если событие в точке, которая дальше чем на radius // верхнего левого угла, то обрабатываем его if (radiusSquare < viewX * viewX + viewY * viewY) { // теорема Пифагора :) if (event.getAction() == MotionEvent.ACTION_UP) { Log.d("happy", "clicked"); if (myListener != null) { myListener.onClick(this); } } return true; } // события вне кликабельной области отправляются дальше return false; } /** * myListener будет возвращать клики из кликабельной области нашей вьюхи * (см. выше в onTouchEvent()) */ public void setSpecialOnClickListener(OnClickListener myListener) { this.myListener = myListener; } } Подписываемся на клики через setSpecialOnClickListener(): hello = (MyCutomView)findViewById(R.id.hello); hello.setSpecialOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast .makeText(MainActivity.this, "clicked", Toast.LENGTH_SHORT) .show(); } });

Комментариев нет:

Отправить комментарий