国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android編程實現(xiàn)滑動開關(guān)組件功能【附源碼下載】

2019-12-12 01:15:23
字體:
供稿:網(wǎng)友

本文實例講述了Android編程實現(xiàn)滑動開關(guān)組件功能。分享給大家供大家參考,具體如下:

由于Android并未提供滑動開關(guān)之類的組件,所以我們需要自己去實現(xiàn)一個自定義的視圖組件來實現(xiàn)滑動開關(guān)效果。

這里有一個示例代碼,它包括三個類:開關(guān)組件視圖、狀態(tài)監(jiān)聽接口、MainActivity

我們先來看看整個demo的效果圖:

我們先來看看視圖組件的完整代碼,代碼都已經(jīng)注釋:

package com.bear.swtichbuttondemo;import java.util.ArrayList;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;/** * 自定義滑動開關(guān) */public class MySwitchButton extends View implements OnTouchListener {  private Bitmap switchOnBkg; // 開關(guān)開啟時的背景  private Bitmap switchOffBkg; // 開關(guān)關(guān)閉時的背景  private Bitmap slipSwitchButton; // 滑動開關(guān)的圖片  private boolean isSlipping = false; // 是否正在滑動  private boolean isSwitchOn = false; // 當(dāng)前開關(guān)的狀態(tài),true表示開啟,flase表示關(guān)閉  private float previousX; // 手指按下時的水平坐標(biāo)x  private float currentX; // 當(dāng)前的水平坐標(biāo)X  private ArrayList<OnSwitchListener> onSwitchListenerList; // 開關(guān)監(jiān)聽器列表  public MySwitchButton(Context context, AttributeSet attrs) {    super(context, attrs);    init();  }  private void init() {    this.setOnTouchListener(this); // 設(shè)置觸摸監(jiān)聽器    onSwitchListenerList = new ArrayList<OnSwitchListener>();  }  public void setImageResource(int switchBkg, int slipBtn) {    switchOnBkg = BitmapFactory.decodeResource(this.getResources(),        switchBkg);    switchOffBkg = BitmapFactory.decodeResource(this.getResources(),        switchBkg);    slipSwitchButton = BitmapFactory.decodeResource(this.getResources(),        slipBtn);  }  public void setSwitchState(boolean switchState) {    this.isSwitchOn = switchState;    this.invalidate();  }  public boolean getSwitchState() {    return this.isSwitchOn;  }  public void setOnSwitchStateListener(OnSwitchListener listener){    onSwitchListenerList.add(listener);  }  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    Matrix matrix = new Matrix();    Paint paint = new Paint();    float leftSlipBtnX; // 滑動按鈕的左邊坐標(biāo)    //畫開關(guān)的背景圖片    canvas.drawBitmap(switchOnBkg, matrix, paint);    if (isSlipping) {      // 如果正在滑動      if (currentX > switchOnBkg.getWidth()) {        leftSlipBtnX = switchOnBkg.getWidth()            - slipSwitchButton.getWidth();      } else {        leftSlipBtnX = currentX - slipSwitchButton.getWidth();      }    } else {      //如果沒有滑動      if (isSwitchOn) {        leftSlipBtnX = switchOnBkg.getWidth()            - slipSwitchButton.getWidth();      } else {        leftSlipBtnX = 0;      }    }    //如果手指滑出了開關(guān)的范圍,應(yīng)當(dāng)這樣處理    if (leftSlipBtnX < 0) {      leftSlipBtnX = 0;    } else if (leftSlipBtnX > switchOnBkg.getWidth()        - slipSwitchButton.getWidth()) {      leftSlipBtnX = switchOnBkg.getWidth() - slipSwitchButton.getWidth();    }    //在畫布上畫開關(guān)圖片    canvas.drawBitmap(slipSwitchButton, leftSlipBtnX, 0, paint);  }  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    setMeasuredDimension(switchOnBkg.getWidth(), switchOnBkg.getHeight());  }  @Override  public boolean onTouch(View v, MotionEvent event) {    //獲取觸摸動作類型    int action = event.getAction();    switch (action) {    case MotionEvent.ACTION_MOVE:      //如果現(xiàn)在處于手指一動狀態(tài)      currentX = event.getX();      break;    case MotionEvent.ACTION_DOWN:      //如果現(xiàn)在手指剛剛按上屏幕狀態(tài)      isSlipping = true;      break;    case MotionEvent.ACTION_UP:      //如果現(xiàn)在手指剛剛離開屏幕狀態(tài)      isSlipping = false;      boolean previousState = isSwitchOn;      if (event.getX() > (switchOnBkg.getWidth() / 2)) {        isSwitchOn = true;      } else {        isSwitchOn = false;      }      //調(diào)用接口回調(diào)方法,將開關(guān)狀態(tài)通知給監(jiān)聽對象      if(previousState != isSwitchOn){        if(onSwitchListenerList.size() > 0){          for(OnSwitchListener listener : onSwitchListenerList){            listener.onSwitched(isSwitchOn);          }        }      }      break;    default:      break;    }    this.invalidate();    return true;  }}

我們再來看看開關(guān)狀態(tài)監(jiān)聽接口代碼,如下:

package com.bear.swtichbuttondemo;public interface OnSwitchListener {  public abstract void onSwitched(boolean isSwitchOn);}

最后是我們的Activity中的代碼,這里需要傳兩張圖片給自定義組件,當(dāng)然你也可以傳兩張自己做好的圖片,代碼如下:

package com.bear.swtichbuttondemo;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity {  private MySwitchButton mySwitchButton;  private Button myBtn;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    setupViews();  }  private void setupViews() {    mySwitchButton = (MySwitchButton) findViewById(R.id.my_switch_button);    //傳圖片給自定義組件    mySwitchButton.setImageResource(R.drawable.switch_bkg_switch,        R.drawable.switch_btn_slip);    myBtn = (Button) findViewById(R.id.button);    //設(shè)置開關(guān)狀態(tài)監(jiān)聽    mySwitchButton.setOnSwitchStateListener(new OnSwitchListener() {      @Override      public void onSwitched(boolean isSwitchOn) {        if (isSwitchOn) {          Toast.makeText(MainActivity.this, "開關(guān)開啟",              Toast.LENGTH_SHORT).show();        } else {          Toast.makeText(MainActivity.this, "開關(guān)關(guān)閉",              Toast.LENGTH_SHORT).show();        }      }    });    myBtn.setOnClickListener(new OnClickListener() {      @Override      public void onClick(View v) {        boolean isOn = mySwitchButton.getSwitchState();        mySwitchButton.setSwitchState(!isOn);      }    });  }}

附:完整實例代碼點擊此處本站下載

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android基本組件用法總結(jié)》、《Android開發(fā)入門與進階教程》、《Android布局layout技巧總結(jié)》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 松桃| 谢通门县| 车致| 毕节市| 赫章县| 紫金县| 突泉县| 绥江县| 资阳市| 长宁县| 山阳县| 洞头县| 武山县| 依安县| 民县| 天等县| 班玛县| 丰原市| 高雄市| 上高县| 涿州市| 安龙县| 周口市| 东乡族自治县| 兴仁县| 印江| 商水县| 新乡县| 呼伦贝尔市| 冀州市| 文化| 闸北区| 自贡市| 石林| 尉犁县| 北票市| 桐梓县| 深州市| 淮阳县| 开阳县| 焉耆|