欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

自定義滑動(dòng)開(kāi)關(guān) - 新聞資訊 - 云南小程序開(kāi)發(fā)|云南軟件開(kāi)發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開(kāi)發(fā)/軟件開(kāi)發(fā)

知識(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)前位置>首頁(yè) » 新聞資訊 » 技術(shù)分享 >

自定義滑動(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)案例查看更多