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

首頁 > 系統 > Android > 正文

Android開發實現自定義水平滾動的容器示例

2019-10-22 18:25:31
字體:
來源:轉載
供稿:網友

本文實例講述了Android開發實現自定義水平滾動的容器。分享給大家供大家參考,具體如下:

public class HorizontalScrollView extends ViewGroup {  //手勢  private GestureDetector mGestureDetector;  private HorizontalScroller mScroller;  private int curID;  //快速滑動  private boolean isFlying;  //--回調函數-------------------------------------  private OnChangeListener mListener;  public void setOnChangeListener(OnChangeListener listener) {    if (listener != null) {      mListener = listener;    }  }  public interface OnChangeListener{    void move2dest(int curID);  }  public HorizontalScrollView(Context context) {    this(context, null);  }  public HorizontalScrollView(Context context, AttributeSet attrs) {    this(context, attrs, 0);  }  public HorizontalScrollView(Context context, AttributeSet attrs, int defStyle) {    super(context, attrs, defStyle);    mScroller = new HorizontalScroller();    isFlying = false;    initGesture(context);  }  @Override  protected void onLayout(boolean changed, int l, int t, int r, int b) {    // 模向移動,    for (int i = 0; i < getChildCount(); i++) {      View view = getChildAt(i);      //給水平方向的每個view定位      view.layout(i * getWidth(), 0, getWidth() + i * getWidth(), getHeight());    }  }  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    for (int i = 0; i < getChildCount(); i++) {      View view = getChildAt(i);      view.measure(widthMeasureSpec, heightMeasureSpec);    }    super.onMeasure(widthMeasureSpec, heightMeasureSpec);  }  @Override  public boolean onTouchEvent(MotionEvent event) {    mGestureDetector.onTouchEvent(event);    switch (event.getAction()) {    case MotionEvent.ACTION_DOWN:      if (!isFlying) {        move2dest();      }      isFlying = false;      break;    case MotionEvent.ACTION_MOVE:      break;    case MotionEvent.ACTION_UP:      break;    default:      break;    }    return true;  }  public void move2dest() {    //    int destID = (getScrollX() + getWidth() / 2) / getWidth();    move2dest(destID);  }  public void move2dest(int destID) {    curID = destID;    if (destID > getChildCount() - 1) {      destID = getChildCount() - 1;    }    if (mListener != null) {      mListener.move2dest(curID);    }    int distance = (int) (destID * getWidth() - getScrollX());    // scrollBy(distance, 0);    mScroller.startScroll(getScrollX(), getScrollY(), distance, 0);    invalidate();  }  /**   * invalidate()此方法會觸發下面的方法   */  @Override  public void computeScroll() {    // 如果存在偏移,就不斷刷新    if (mScroller.computeScrollOffset()) {      scrollTo(mScroller.getCurrX(), 0);      invalidate();    }    super.computeScroll();  }  private void initGesture(Context context) {    mGestureDetector = new GestureDetector(context, new OnGestureListener() {      @Override      public boolean onSingleTapUp(MotionEvent e) {        return false;      }      @Override      public void onShowPress(MotionEvent e) {      }      @Override      public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {        scrollBy((int) distanceX, 0);        return false;      }      @Override      public void onLongPress(MotionEvent e) {      }      @Override      /**       * 快速滑動時       */      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {        isFlying = true;        if (curID > 0 && velocityX > 0) {// 表示向左移          move2dest(curID - 1);        } else if (curID < getChildCount() && velocityX < 0) {          move2dest(curID + 1);// 向右        } else {          move2dest();// 移到原位        }        return false;      }      @Override      public boolean onDown(MotionEvent e) {        return false;      }    });  }}
/** * 位移計算工具類 * * @author chenlin * */public class HorizontalScroller {  private int startX;  private int startY;  private int distanceX;  private int distanceY;  private int currentX;  private int currentY;  private long startTime;  private long duration = 1000L;  private boolean isFinish;  /**   *   * @param scrollX   *      x坐標   * @param scrollY   *      y坐標   * @param distanceX   *      X方向移動的距離   * @param distanceY   *      y方向移動的距離   */  public void startScroll(int scrollX, int scrollY, int distanceX, int distanceY) {    startX = scrollX;    startY = scrollY;    this.distanceX = distanceX;    this.distanceY = distanceY;    isFinish = false;    startTime = SystemClock.uptimeMillis();  }  /**   * 計算偏移量,   *   * @return true 還在移動 false:移動已經停止   */  public boolean computeScrollOffset() {    if (isFinish) {      return false;    }    long timePassed = SystemClock.uptimeMillis() - startTime;    if (timePassed < duration) {      currentX = (int) (startX + distanceX * timePassed / duration);      currentY = (int) (startY + distanceY * timePassed / duration);      System.out.println("currentX:::" + currentX);    } else if (timePassed >= duration) {      currentX = startX + distanceX;      currentY = startY + distanceY;      isFinish = true;    }    return true;  }  public int getCurrX() {    return currentX;  }  public void setCurrentX(int currentX) {    this.currentX = currentX;  }  public int getCurrentY() {    return currentY;  }  public void setCurrentY(int currentY) {    this.currentY = currentY;  }}

使用方法

public class ScrollActivity extends Activity implements OnCheckedChangeListener, OnChangeListener {  private int[] ids = { R.drawable.a1, R.drawable.a2, R.drawable.a3, R.drawable.a4, R.drawable.a5, R.drawable.a6 };  private HorizontalScrollView mView;  private LinearLayout mLayout;  private RadioGroup mGroup;  @Override  protected void onCreate(Bundle savedInstanceState) {    requestWindowFeature(Window.FEATURE_NO_TITLE);    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_myscrollview);    init();  }  private void init() {    mLayout = (LinearLayout) findViewById(R.id.body_layout);    mGroup = (RadioGroup) findViewById(R.id.radiogroup);    mView = new HorizontalScrollView(this);    for (int i = 0; i < ids.length; i++) {      ImageView imageView = new ImageView(this);      imageView.setBackgroundResource(ids[i]);      mView.addView(imageView);    }    mLayout.addView(mView);    // 隨便添加一個view    View view = getLayoutInflater().inflate(R.layout.activity_progressview, null);    mView.addView(view, 3);    for (int i = 0; i < mView.getChildCount(); i++) {      RadioButton radioButton = new RadioButton(this);      // 設置id的編號      radioButton.setId(i);      mGroup.setOrientation(LinearLayout.HORIZONTAL);      mGroup.addView(radioButton);      if (i == 0) {        radioButton.setChecked(true);      }    }    mGroup.setOnCheckedChangeListener(this);    mView.setOnChangeListener(this);  }  @Override  public void onCheckedChanged(RadioGroup group, int checkedId) {    mView.move2dest(checkedId);  }  @Override  public void move2dest(int curID) {    RadioButton radioButton = (RadioButton) mGroup.getChildAt(curID);    radioButton.setChecked(true);  }}

布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  android:orientation="vertical" >  <RadioGroup    android:id="@+id/radiogroup"    android:layout_width="wrap_content"    android:layout_height="wrap_content" >  </RadioGroup>  <LinearLayout    android:id="@+id/body_layout"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >  </LinearLayout></LinearLayout>

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 化州市| 开封县| 孝感市| 遵义市| 井冈山市| 宝兴县| 旌德县| 维西| 资兴市| 澎湖县| 新巴尔虎右旗| 山丹县| 竹溪县| 贵阳市| 彭州市| 灵寿县| 江西省| 兰溪市| 北海市| 枝江市| 凤城市| 曲阳县| 长寿区| 镇巴县| 巴塘县| 封丘县| 军事| 武穴市| 南部县| 建平县| 慈溪市| 郓城县| 城固县| 丹凤县| 安吉县| 高碑店市| 淮安市| 江城| 江北区| 胶州市| 哈尔滨市|