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

Комментарии 8

Терпение и труд все перетрут даже без документации и книг.
Перетрут то перетрут, но вот все ли создадут?
Ну что-то да создадут. Вопрос в другом, правильно ли?
Уберите статью из хаба «Android», пожалуйста. Те, кому эта статья может пригодится, и так её увидят, потому что подписаны на хаб «Разработка под Android»
Сделано
Ух ты, моему старичку Gio тоже два года уже — прелестнейший аппарат! А где же сам локер? Я б поставил… И еще, не по сабжу, как вы сделали эти прикольные переключалки (0:19) в стиле четвертого андройда?
Сам локер в ближайшем будущем появится на 4pda (ссылка на странице видео). Пока последняя версия локера поддерживает только разрешение HVGA и должна быть установлена в system/app (для прямого добавления виджетов).

По поводу переключалок скажу, что это кастомный View.
Код переключалки
public class Switcher extends View {
	
	OnSwitchEventListener osel;
	Bitmap bg;
	Bitmap on;
	Bitmap onS;
	Bitmap off;
	Bitmap offS;
	int w;
	int marginTop = 0;
	int x;
	int drawX;
	boolean state = false;
	boolean isDrag = false;
	boolean isTouch = false;

	public Switcher(Context context, AttributeSet attrs) {
		super(context, attrs);
		bg = BitmapFactory.decodeResource(getResources(), R.drawable.switch_bg);
		on = BitmapFactory.decodeResource(getResources(), R.drawable.switch_on);
		onS = BitmapFactory.decodeResource(getResources(), R.drawable.switch_on_sel);
		off = BitmapFactory.decodeResource(getResources(), R.drawable.switch_off);
		offS = BitmapFactory.decodeResource(getResources(), R.drawable.switch_off_sel);
	}
	
	public void setState(boolean s){
		state = s;
		invalidate();
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		canvas.drawBitmap(bg, 0, marginTop, null);
		if(isTouch){
			if(isDrag){
				if(drawX < w/4){
					canvas.drawBitmap(offS, drawX, marginTop, null);
				} else {
					canvas.drawBitmap(onS, drawX, marginTop, null);
				}
			} else {
				if(state){
					canvas.drawBitmap(onS, drawX, marginTop, null);
				} else {
					canvas.drawBitmap(offS, drawX, marginTop, null);
				}
			}
		} else {
			if(state){
				drawX = w/2;
				canvas.drawBitmap(on, drawX, marginTop, null);
			} else {
				draw_x = 0;
				canvas.drawBitmap(off, drawX, marginTop, null);
			}
		}
    }
	
	@Override
	protected void onMeasure(int wms, int hms){
		super.onMeasure(wms, hms);
		w = MeasureSpec.getSize(wms);
		marginTop = (MeasureSpec.getSize(hms)-bg.getHeight())/2;
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent me) {
		int tx = (int)me.getX();
		if(me.getAction() == MotionEvent.ACTION_DOWN){
			isTouch = true;
			isDrag = false;
			x = tx;
    		} else if(me.getAction() == MotionEvent.ACTION_MOVE){
    			if(Math.abs(x-tx) > w/10 || isDrag){
    				getParent().requestDisallowInterceptTouchEvent(true);
    				isDrag = true;
    				if(state){
    					drawX = w/2-x+tx;
    				} else {
    					drawX = tx-x;
    				}
    				if(drawX < 0){
    					drawX = 0;
    				} else if(drawX > w/2){
    					drawX = w/2;
    				}
    			}
    		} else if(me.getAction() == MotionEvent.ACTION_UP && isTouch){
    			getParent().requestDisallowInterceptTouchEvent(false);
    			if(isDrag){
    				if(drawX < w/4){
    					state = false;
    					drawX = 0;
    				} else {
    					state = true;
    					drawX = w/2;
    				}
    			} else {
    				if(state){
    					state = false;
    					drawX = 0;
    				} else {
    					state = true;
    					drawX = w/2;
    				}
    			}
    			isDrag = false;
    			isTouch = false;
    			if(osel != null){
    				osel.onChangeState(state);
    			}
    		} else if(me.getAction() == MotionEvent.ACTION_CANCEL){
    			getParent().requestDisallowInterceptTouchEvent(false);
    			if(state){
				drawX = w/2;
			} else {
				drawX = 0;
			}
    			isDrag = false;
    			isTouch = false;
    		}
		invalidate();
		return true;
	}
	
	public interface OnSwitchEventListener {
		public void onChangeState(boolean state);
	}
	
	public void setOnSwitchEventListener(OnSwitchEventListener sel){
		osel = sel;
	}
}

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации