閒著沒事,把之前寫的乙個demo放上來分享下。就是乙個開關,實現可滑動和動畫效果。不是切換。
好了,先上圖:
直接把自定義的這個view**放上來,有注釋應該很好理解:
首先是布局:
<?xml version="1.0" encoding="utf-8"?>
接著是這個view的**,繼承自linearlayout :
package com.lxb.switchdemo;
import android.content.context;
import android.graphics.color;
import android.os.handler;
import android.os.message;
import android.view.layoutinflater;
import android.view.motionevent;
import android.view.view;
import android.view.view.onclicklistener;
import android.view.animation.animation;
import android.view.animation.animation.animationlistener;
import android.view.animation.linearinterpolator;
import android.view.animation.translateanimation;
import android.widget.imageview;
import android.widget.linearlayout;
import android.widget.relativelayout;
import android.widget.textview;
public class switchview extends linearlayout implements onclicklistener
@override
protected void onlayout(boolean changed, int l, int t, int r, int b)
private handler mhandler = new handler()
} };
public void onclick(view v)
} /**
* 初始化控制項
*/private void initview()
if(cursor_right >= bg_right - margin)
v.layout(cursor_left, cursor_top, cursor_right, cursor_bottom);
lastx = (int) event.getrawx();
break;
case motionevent.action_up:
calculateischeck();
break;
}return true;
}}); }
/*** 計算處於true或是false區域, 並做改變處理
*/private void calculateischeck() else }
/*** 改變checked, 根據checked移動游標
* @param ischecked
*/private void changechecked(boolean ischecked) else
if(ischecked) else
cursormove(); }
/*** 游標移動
*/private void cursormove() else
animation.setduration(100);
animation.setinterpolator(new linearinterpolator());
animation.setanimationlistener(new animationlistener()
public void onanimationrepeat(animation animation)
public void onanimationend(animation animation) else
// 這裡不能馬上layout游標正確位置, 否則會有一點點閃屏
// 為了美觀, 這裡遲了一點點呼叫layout方法, 便不會閃屏
mhandler.sendemptymessagedelayed(handle_layout_cursor, 5);
// 這裡是根據是不是改變了ischecked值進行一些操作
if(checkedchange)
changetextcolor();}}
});iv_switch_cursor.startanimation(animation);
} /**
* 改變字型顯示顏色
*/private void changetextcolor() else }
/*** layout游標
*/private void layoutcursor() else
iv_switch_cursor.layout(cursor_left, cursor_top, cursor_right, cursor_bottom); }
/*** ischecked值改變***
*/public inte***ce oncheckedchangelistener
public boolean ischecked()
public void setchecked(boolean ischecked)
layoutcursor();
} }public void setoncheckedchangelistener(
oncheckedchangelistener oncheckedchangelistener)
}
最後是activity使用這個view:
package com.lxb.switchdemo;
import android.os.bundle;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.linearlayout;
import android.widget.textview;
import android.widget.toast;
import com.lxb.switchdemo.switchview.oncheckedchangelistener;
public class switch_demoactivity extends activity implements onclicklistener
});layout.addview(sv);
btn_set_true = (button) findviewbyid(r.id.btn_set_true);
btn_set_false = (button) findviewbyid(r.id.btn_set_false);
btn_getstate = (button) findviewbyid(r.id.btn_getstate);
btn_set_true.setonclicklistener(this);
btn_set_false.setonclicklistener(this);
btn_getstate.setonclicklistener(this);
}public void onclick(view v)
}
private string getstate(boolean state)
return "關";}}
實現起來還是很簡單的,主要還是座標什麼的需要計算與調整。
當然可能還會有一些bug存在,有需要的可以下下來自行修改,也可以和我討論。
Android 自定義滑動開關
自定義view寫了這麼多篇幅,通用的屬性部分 測量 忽略不計 真正實現的部分就不到100行 先上效果圖 關閉狀態 開啟狀態 動起來 下面我們看下我們的實現 override protected void ondraw canvas canvas private void drawswichballb...
可觸控滑動具有回彈效果的Vue元件使用總結
發現乙個很實用的vue元件,最近做專案遇到一種常見的需要,雖說常見但是自己沒有試著寫過,然後去網上找了一下。需求圖如下 下面的導航欄內容太多需要做成滑動的 下面介紹一下我用到的這個元件 git位址 modulename refname isscreen isscreen getsearch gets...
Android 滑動效果高階篇(五) 3D旋轉
前面介紹了利用android自帶的控制項,進行滑動翻頁製作效果,現在我們通過 實現一些滑動翻頁的動畫效果。animation實現動畫有兩個方式 幀動畫 frame by frame animation 和補間動畫 tweened animation 本示例通過繼承animation自定義rotate...