Комментарии 8
Терпение и труд все перетрут даже без документации и книг.
Уберите статью из хаба «Android», пожалуйста. Те, кому эта статья может пригодится, и так её увидят, потому что подписаны на хаб «Разработка под Android»
Ух ты, моему старичку Gio тоже два года уже — прелестнейший аппарат! А где же сам локер? Я б поставил… И еще, не по сабжу, как вы сделали эти прикольные переключалки (0:19) в стиле четвертого андройда?
Сам локер в ближайшем будущем появится на 4pda (ссылка на странице видео). Пока последняя версия локера поддерживает только разрешение HVGA и должна быть установлена в system/app (для прямого добавления виджетов).
По поводу переключалок скажу, что это кастомный View.
По поводу переключалок скажу, что это кастомный 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;
}
}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Как я писал кастомный локер