開源Pull_To_Refresh控制項使用

來源:互聯網
上載者:User

標籤:

學習知識點
  1. onTouch事件傳遞機制。
  2. Lisenter監聽
  3. ImageView的src background scaleType不同屬性的顯示情況。
  4. onTouch滑動抬起調用的MotionEvent.ACTION_CANCEL不是MotionEvent.ACTION_UP
開發步驟

① 建立Activity Layout
② 繼承ViewPager 建立AutoScrollViewPager
③ 顯示點
④ 添加監聽OnPageChangedListener
⑤ 自動滾動
⑥ 手動滾動時 停止滾動

繼承ViewPager 建立AutoScrollViewPager
public class AutoScrollViewPager extends ViewPager {

// .xml
public AutoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
<com.itheima.autoscroll.view.AutoScrollViewPager
android:id="@+id/sroll_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#47659E" />
設定圓點
// 選取器:selector 管理素材的對象 根據 不同的狀態顯示不同的圖片 press
// select=true false
// view.setSlected()
private List<ImageView> dots = new ArrayList<ImageView>();
public void init(int pageNumber, LinearLayout layoutDot) {
// 3
pageCount = pageNumber;
// .xml
// .java
for (int i = 0; i < pageNumber; i++) {
ImageView img = new ImageView(getContext());
img.setBackgroundResource(R.drawable.dot_selector);
img.setSelected(false);// 紅
// .xml layout_width layout_height
// .java LinearLayout.LayoutParams 布局參數
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(//
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
// .xml marginRight
// .java rightMargin
p.rightMargin = 6;
layoutDot.addView(img, p);
dots.add(img);
}
dots.get(0).setSelected(true);
// 設定內容
PagerAdapter adpater = new ImageViewAdapter();
this.setAdapter(adpater);// PageAdpater FragmentPageAdapter

// ④ 添加監聽OnPageChangedListener
// ⑤ 自動滾動保持點的同步
// ⑥ 手動滾動時 停止滾動
OnPageChangeListener listener = new MyOnPageChangeListener();
this.setOnPageChangeListener(listener);// OnPageChangeListener監聽滑動到第幾頁
}
添加頁面選中監聽監聽 同步

通過ViewPage 選中狀態來控制頁面的標題和圓點的同步


private class MyOnPageChangeListener implements OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int arg0) {

}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {

}

// 滑動第幾頁面
@Override
public void onPageSelected(int arg0) {

// 3
// 0 1 2 3 4 5
// 取餘操作
// 0 1 2 ->0 1 2
// 舊點不亮
if (isLooping) {
dots.get(currPageIndex % pageCount).setSelected(false);
// 新點高亮
currPageIndex = arg0;
dots.get(currPageIndex % pageCount).setSelected(true);
} else {
dots.get(currPageIndex).setSelected(false);
// 新點高亮
currPageIndex = arg0;
dots.get(currPageIndex).setSelected(true);
}

}

}

private int currPageIndex = 0;

private class ImageViewAdapter extends PagerAdapter {

// 頁數
@Override
public int getCount() {
if (isLooping) {
return Integer.MAX_VALUE;
} else {
return pageCount;
}
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}

// 當前顯示視圖
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 建立顯示的頁面 是一張圖片
ImageView imag = new ImageView(getContext());
imag.setBackgroundResource(R.drawable.home_scroll_default);
// .xml layout_width layout_height
// .java ViewPager.LayoutParams
ViewPager.LayoutParams p = new ViewPager.LayoutParams();
p.width = ViewPager.LayoutParams.MATCH_PARENT;
p.height = ViewPager.LayoutParams.MATCH_PARENT;
container.addView(imag, p);


return imag;
}

// 移除顯示

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((ImageView) object);
}

}
自動輪播

原理: 通過Handle發送延時訊息。類似遞迴的實現

2.4.自動滾動
// 支援無限滑動
private boolean isLooping = false;
public void setLooping(boolean flag) {
isLooping = flag;
}
private Handler handler = new Handler() {
// 回呼函數: 1.重寫 2.系統或其它對象調用
// on
public void handleMessage(android.os.Message msg) {
if (msg.what == 1) {
Log.i("wzx", "切換到下一頁");
// 切換到下一頁
int curr = getCurrentItem();
++curr;
setCurrentItem(curr);// 顯示指定頁面
// 重寫給自己發一個訊息
// Message msg=new Message();
Message msg2 = handler.obtainMessage();// obtain=get 是一種最佳化寫法
// 內部尋找可重用的Message 如果有就重用 沒有呢 才建立新的。
msg2.what = 1;
handler.sendMessageDelayed(msg2, 3000);// ---->handleMessage
// 迴圈發送息
}
};
};

// 支援自動播放
// 暴露給外面調用。
public void startScroll() {
// 3000
// Message msg=new Message();
Message msg = handler.obtainMessage();// obtain=get 是一種最佳化寫法
// 內部尋找可重用的Message 如果有就重用 沒有呢 才建立新的。
msg.what = 1;
handler.sendMessageDelayed(msg, 3000);// ---->handleMessage

}

/**
* 停止播放
*/

public void stopScroll() {
// 清除所有訊息 handleMessage就不能執行
// 使用回呼函數沒有條件滿足
handler.removeCallbacksAndMessages(null);//

}
手動滾動時 停止滾動
 OnTouchListener listener = new MyOnTouchListener();
imag.setOnTouchListener(listener);

private class MyOnTouchListener implements OnTouchListener {

private int downX = 0;
private long downTime = 0;

// MotionEvent 歸屬地位置改變 小火箭
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {// 擷取動作
case MotionEvent.ACTION_DOWN:// 按下
stopScroll();
downX = (int) event.getX();// 擷取按下位
downTime = System.currentTimeMillis();// 儲存按下時間
Log.i("wzx", "ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:// 移動
Log.i("wzx", "ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:// 提起
Log.i("wzx", "ACTION_UP");
int upX = (int) event.getX();
if (downX == upX && System.currentTimeMillis() - downTime < 300) {

//使用Command設計模式 可以增加一個介面作監聽器
//1.建立interface
//2.抽象方法 (抽取代碼 去掉方法體)
//3.添加監聽器
//4.監聽器是要被調用。
//讓開發人員把代碼寫監聽器裡(控制項外邊)
// onItemClick();
if(listener!=null)
{
listener.onItemClick();//方法內部的代碼
}
}
startScroll();
break;
case MotionEvent.ACTION_CANCEL:// 取消
Log.i("wzx", "ACTION_CANCEL");
startScroll();
break;
}
return true;// 傳回值 處理這個事件就返回true
}


}
單機回調Command設計模式

原理:

  1. 設定監聽介面,定義方法
 private OnViewClickListener listener ;
public interface OnViewClickListener
{
public void onViewClick();
}
  1. 設定監聽方法
 public void setOnViewClickListener(OnViewClickListener listener)
{
this.listener = listener;
}
  1. 在觸摸ACTION_UP調用回調方法
 case MotionEvent.ACTION_UP:
startScroll();
//保證是單機,
if(dowx == event.getX() & System.currentTimeMillis() - mDownTimel<300)
{
//回調事件
listener.onViewClick();
}

break;

開源Pull_To_Refresh控制項使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.