知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷(xiāo)的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷(xiāo)工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
自定義滑動(dòng)開(kāi)關(guān)
發(fā)表時(shí)間:2021-1-10
發(fā)布人:葵宇科技
瀏覽次數(shù):41
轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/forwardyzk/article/details/42526343
當(dāng)開(kāi)發(fā)的時(shí)候,使用開(kāi)關(guān)的時(shí)候,效果不能不滿(mǎn)足我們的需求,要表現(xiàn)出滑動(dòng)的效果。我們就可以自定義開(kāi)關(guān)。
思路:
1.把開(kāi)關(guān)分為兩部分,一部分是開(kāi)關(guān)的背景,另一部分是滑動(dòng)按鈕。
2.測(cè)量開(kāi)關(guān)的長(zhǎng)和寬,當(dāng)然是在onMeasure中進(jìn)行處理
3.在onTouchEvent()根據(jù)觸摸開(kāi)關(guān)進(jìn)行滑動(dòng)位置進(jìn)行監(jiān)聽(tīng),在onDraw()中進(jìn)行繪畫(huà)。
當(dāng)然也要繪畫(huà)兩部分:開(kāi)關(guān)背景和滑動(dòng)按鈕
4.對(duì)觸摸位置和滑動(dòng)位置進(jìn)行判斷
1.觸摸位置要在開(kāi)關(guān)背景的范圍內(nèi)。
2.在繪畫(huà)的時(shí)候,滑動(dòng)按鈕不能超出開(kāi)關(guān)背景的范圍。
在onTouchEvent()方法中調(diào)用invalidate()方法,會(huì)根據(jù)位置的變化不斷的在onDraw()方法中繪畫(huà)按鈕。
設(shè)置開(kāi)關(guān)的背景和滑動(dòng)按鈕
onXPosition和offXPosition為開(kāi)關(guān)狀態(tài)的變化之間,滑動(dòng)按鈕左側(cè)的X坐標(biāo)不能必須在兩者之間。
public void setImageResource(int switchOnBg, int slipBtn) { Log.d(TAG, "setImageResource"); switch_bg = BitmapFactory.decodeResource(getResources(), switchOnBg); slip_Btn = BitmapFactory.decodeResource(getResources(), slipBtn); onXPosition = switch_bg.getWidth() - slip_Btn.getWidth(); offXPosition = 0; }
在OnTouchEvent()中監(jiān)聽(tīng)手勢(shì)滑動(dòng)的位置
public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { // 按下,判斷按下的位置在開(kāi)關(guān)上,才可以做后面的操作 case MotionEvent.ACTION_DOWN: Log.d(TAG, "MotionEvent.ACTION_DOWN"); if (event.getX() > switch_bg.getWidth() || event.getY() > switch_bg.getHeight()) { return false; } isSlipping = true; currentX = event.getX(); break; // 滑動(dòng),記錄當(dāng)前的按下的位置 case MotionEvent.ACTION_MOVE: Log.d(TAG, "MotionEvent.ACTION_MOVE"); currentX = event.getX(); break; // 松開(kāi),設(shè)置開(kāi)關(guān)的監(jiān)聽(tīng)器,設(shè)置開(kāi)關(guān)的狀態(tài) case MotionEvent.ACTION_UP: Log.d(TAG, "MotionEvent.ACTION_UP"); isSlipping = false; // 松開(kāi)前開(kāi)關(guān)的狀態(tài) boolean previousSwitchState = isSwitchOn; // 如果當(dāng)前的位置在開(kāi)關(guān)背景中間位置的右側(cè),表示的是開(kāi)的狀態(tài),否則為關(guān) if (event.getX() >= (switch_bg.getWidth() / 2)) { isSwitchOn = true; } else { isSwitchOn = false; } // 如果設(shè)置了監(jiān)聽(tīng)器,則調(diào)用此方法 if (onSwitchListener != null && (previousSwitchState != isSwitchOn)) { onSwitchListener.onSwitched(isSwitchOn); } break; default: break; } // 重新繪制控件 invalidate();// 不要忘了重繪開(kāi)關(guān) return true; }
在最后不要忘了調(diào)用invalidate(),否則不會(huì)進(jìn)行繪畫(huà)開(kāi)關(guān)。
判斷了觸摸的范圍必須在開(kāi)關(guān)上
在onDraw()繪畫(huà)開(kāi)關(guān)
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); Log.d(TAG, "onDraw"); Matrix matrix = new Matrix(); Paint paint = new Paint(); // 滑動(dòng)按鈕的X方向左側(cè)坐標(biāo) float left_SlipBtn; // 把開(kāi)關(guān)的背景畫(huà)出來(lái) canvas.drawBitmap(switch_bg, matrix, paint); // 判斷當(dāng)前是否正在滑動(dòng) if (isSlipping) { if (currentX > switch_bg.getWidth()) { left_SlipBtn = switch_bg.getWidth() - slip_Btn.getWidth(); } else { // 保持滑動(dòng)的位置是滑動(dòng)按鈕的中間位置 left_SlipBtn = currentX - slip_Btn.getWidth() / 2; } } else { // 根據(jù)當(dāng)前的開(kāi)關(guān)狀態(tài)設(shè)置滑動(dòng)按鈕的位置 if (isSwitchOn) { left_SlipBtn = onXPosition; } else { left_SlipBtn = offXPosition; } } // 對(duì)滑動(dòng)按鈕左側(cè)和右側(cè)進(jìn)行判斷,不能超過(guò)背景的范圍 if (left_SlipBtn < 0) { left_SlipBtn = 0; } else if (left_SlipBtn > switch_bg.getWidth() - slip_Btn.getWidth()) { left_SlipBtn = switch_bg.getWidth() - slip_Btn.getWidth(); } // 繪制滑動(dòng)開(kāi)關(guān) canvas.drawBitmap(slip_Btn, left_SlipBtn, 0, paint); }
canvas.drawBitmap(switch_bg, matrix, paint)繪畫(huà)開(kāi)關(guān)背景
canvas.drawBitmap(slip_Btn, left_SlipBtn, 0, paint)繪畫(huà)滑動(dòng)按鈕
滑動(dòng)按鈕滑動(dòng)的時(shí),保持不能超過(guò)開(kāi)關(guān)背景的范圍,保持點(diǎn)擊的位置在滑動(dòng)按鈕的中間位置。
使用步驟:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/main_button_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="15dp" android:paddingBottom="3dp" android:paddingLeft="25dp" android:paddingRight="25dp" android:paddingTop="3dp" android:text="切換狀態(tài)" android:textSize="15sp" /> <com.example.view.MySlipSwitch android:id="@+id/main_myslipswitch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="20dp" /> </RelativeLayout>
在MainActivity.java中使用
public class MainActivity extends Activity { private Button switch_Btn; private MySlipSwitch slipswitch_MSL; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); setListener(); } public void initView() { slipswitch_MSL = (MySlipSwitch) findViewById(R.id.main_myslipswitch); slipswitch_MSL.setImageResource(R.drawable.switch_bkg_switch, R.drawable.switch_btn_slip); slipswitch_MSL.setSwitchState(true); switch_Btn = (Button) findViewById(R.id.main_button_switch); } public void setListener() { //設(shè)置開(kāi)關(guān)狀態(tài)變化監(jiān)聽(tīng)器 slipswitch_MSL.setOnSwitchListener(new OnSwitchListener() { @Override public void onSwitched(boolean isSwitchOn) { // TODO Auto-generated method stub if (isSwitchOn) { Toast.makeText(getApplicationContext(), "開(kāi)關(guān)已經(jīng)開(kāi)啟", 0).show(); } else { Toast.makeText(getApplicationContext(), "開(kāi)關(guān)已經(jīng)關(guān)閉", 0).show(); } } }); switch_Btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { slipswitch_MSL.setSwitchState(!slipswitch_MSL.getSwitchState()); if (slipswitch_MSL.getSwitchState()) { Toast.makeText(getApplicationContext(), "開(kāi)關(guān)已經(jīng)開(kāi)啟", 0).show(); } else { Toast.makeText(getApplicationContext(), "開(kāi)關(guān)已經(jīng)關(guān)閉", 0).show(); } } }); } }
點(diǎn)擊切換按鈕,獲取開(kāi)關(guān)的狀態(tài)
設(shè)置滑動(dòng)開(kāi)關(guān)狀態(tài)的的監(jiān)聽(tīng)器,滑動(dòng)的位置影響到了開(kāi)關(guān)的狀態(tài),有響應(yīng)的監(jiān)聽(tīng)。
源碼下載: http://download.csdn.net/detail/forwardyzk/8341363
效果圖:
[img]http://img.blog.csdn.net/20150108165542997?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9yd2FyZHl6aw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
相關(guān)案例查看更多
相關(guān)閱讀
- 云南網(wǎng)站建設(shè)招商
- 百度小程序開(kāi)發(fā)
- 網(wǎng)站建設(shè)招商
- 網(wǎng)站上首頁(yè)
- 昆明小程序開(kāi)發(fā)
- 云南小程序制作
- 云南網(wǎng)站開(kāi)發(fā)
- 手機(jī)網(wǎng)站建設(shè)
- 專(zhuān)業(yè)網(wǎng)站建設(shè)公司
- painter
- 云南小程序哪家好
- 云南小程序開(kāi)發(fā)制作公司
- web前端
- 汽車(chē)報(bào)廢回收軟件
- 云南網(wǎng)站建設(shè)公司排名
- 微分銷(xiāo)
- 網(wǎng)站開(kāi)發(fā)哪家好
- 貴州小程序開(kāi)發(fā)
- 定制小程序開(kāi)發(fā)
- 網(wǎng)站維護(hù)
- 生成海報(bào)
- 云南網(wǎng)站建設(shè)首選
- 小程序被騙
- 云南百度小程序
- 文山小程序開(kāi)發(fā)
- 云南網(wǎng)站建設(shè)外包
- 云南網(wǎng)站建設(shè)特性
- 小程序公司
- 網(wǎng)站制作
- 英文網(wǎng)站建設(shè)公司