Как стать автором
Обновить

Пишем свой собственный RadioButton с возможностью масштабирования и выбора цвета.

Совсем недавно начал писать под Android и столкнулся с такой вещью, мне нужно было разместить на дисплее около 20-ти RadioButton’ов. И каково было мое разочарование, что стандартный RadioButton никак нельзя отмасштабировать и менять его цвет.
Тогда я взялся написать свой класс OwnRadioButton, который будет удовлетворять всем потребностям.
И так, делаем свой батон баттон:

OwnRadioButton.java


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

//Класс, аналогичный RadioButton
public class OwnRadioButton  extends View implements OnTouchListener
{
	    private final float x; //Координата по x
	    private final float y; //Координата по y
	    private final int r;   //Радиус окружности
	    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);	  
	    
	    public int fat =4; //Толщина линии оружности
	    public Boolean istouched = false;//выбран ли радио батон
	    public int pushcolor=Color.RED; //Цвет, когда выбран радио батон
	    public int nonpushcolor=Color.BLACK; //Цвет когда не выбран
	    public int bigcirclecolor=Color.WHITE; //Цвет большого круга
	    
	 public OwnRadioButton(Context context, float x, float y, int r,Boolean istouched) 
	 {
		    super(context);
	        setFocusable(true);
	        setFocusableInTouchMode(true);
	        this.setOnTouchListener(this);
	        this.x = x;
	        this.y = y;
	        this.r = r;
	        this.istouched = istouched; 
	   }
	 
	 @Override
	 public void onDraw(Canvas canvas) 
	 {
		mPaint.setColor(bigcirclecolor);  //Цвет внейшней оркужности
		canvas.drawCircle(x, y, r, mPaint); 
		if (istouched==false)// Цвет внутренней окружности
			mPaint.setColor(nonpushcolor); 
		else
			mPaint.setColor(pushcolor); 
		canvas.drawCircle(x, y, r-fat, mPaint); 
	 }
	 
	@Override
	public boolean onTouch(View view, MotionEvent event) 
	{
		invalidate();
		 float xtouch = event.getX();
	     float ytouch = event.getY();
	     if (((x-xtouch)*(x-xtouch)+(y-ytouch)*(y-ytouch))<r*r)
//определяем попал ли клик в область радио батона
         {
	    	 if (event.getAction()== MotionEvent.ACTION_DOWN)
//реагируем только на нажатие на экран
	    	 {
		    	 if (istouched == true) //если батон был уже нажат
		    	 {
		    		 istouched = false;
		    		 return false;
		    	 }
		    	 else
		    	 {
		    		 istouched = true;
		    	     return true;
		    	 }
	    	 }
	    	 return true;
         }
	    else
		return false;
	}	
}   


У этого класса есть множество возможностей для персонализации. Можно выставлять различные цвета кнопок, радиусы как внешнего, так и внутреннего круга (см. комментарии).
Пример вызова:

OwnRadioButtonActivity.java


//...
     	final FrameLayout main = (FrameLayout) findViewById(R.id.main_view);
     	OwnRadioButton radio = new OwnRadioButton(this,50,50,25,false);
     	OwnRadioButton radio2 = new OwnRadioButton(this,100,50,25,false);
     	radio2.fat = 1;
     	radio2.bigcirclecolor=Color.MAGENTA;
         main.addView(radio);
         main.addView(radio2);
//...


Надеюсь, что статья кому-нибудь пригодиться. И пара картинок:
image

Пользовался этой статьей
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.