#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(); } });
Комментариев нет:
Отправить комментарий