安卓中級教程(5):ScrollView與refreshable之間的設置

設置向下拉動更新。

 

  1 package com.mycompany.Scroll_test;
  2 
  3 import android.app.*;
  4 import android.os.*;
  5 import android.view.*;
  6 import android.widget.*;
  7 
  8 
  9 /**
 10  * 刷新控制view
 11  * 
 12  * @author Nono
 13  * 
 14  */
 15 public class RefreshableView extends LinearLayout {
 16 
 17     private static final String TAG = "LILITH";
 18     private Scroller scroller;
 19     private View refreshView;
 20     private ImageView refreshIndicatorView;
 21     private int refreshTargetTop = -60;
 22     private ProgressBar bar;
 23     private TextView downTextView;
 24     private TextView timeTextView;
 25 
 26     private RefreshListener refreshListener;
 27 
 28     private String downTextString;
 29     private String releaseTextString;
 30 
 31     private Long refreshTime = null;
 32     private int lastX;
 33     private int lastY;
 34     // 拉動標記
 35     private boolean isDragging = false;
 36     // 是否可刷新標記
 37     private boolean isRefreshEnabled = true;
 38     // 在刷新中標記
 39     private boolean isRefreshing = false;
 40 
 41 
 42     private Context mContext;
 43     public RefreshableView(Context context) {
 44         super(context);
 45         mContext = context;
 46 
 47     }
 48     public RefreshableView(Context context, AttributeSet attrs) {
 49         super(context, attrs);
 50         mContext = context;
 51         init();
 52 
 53     }
 54     private void init() {
 55         // TODO Auto-generated method stub
 56         //滑動對象,
 57         scroller = new Scroller(mContext);
 58 
 59         //刷新視圖頂端的的view
 60         refreshView = LayoutInflater.from(mContext).inflate(R.layout.refresh_top_item, null);
 61         //指示器view
 62         refreshIndicatorView = (ImageView) refreshView.findViewById(R.id.indicator);
 63         //刷新bar
 64         bar = (ProgressBar) refreshView.findViewById(R.id.progress);
 65         //下拉顯示text
 66         downTextView = (TextView) refreshView.findViewById(R.id.refresh_hint);
 67         //下來顯示時間
 68         timeTextView = (TextView) refreshView.findViewById(R.id.refresh_time);
 69 
 70         LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, -refreshTargetTop);
 71         lp.topMargin = refreshTargetTop;
 72         lp.gravity = Gravity.CENTER;
 73         addView(refreshView, lp);
 74         downTextString = mContext.getResources().getString(R.string.refresh_down_text);
 75         releaseTextString = mContext.getResources().getString(R.string.refresh_release_text);        
 76     }
 77 
 78 
 79 
 80 
 81     /**
 82      * 刷新
 83      * @param time
 84      */
 85     private void setRefreshText(String time) {
 86         // TODO Auto-generated method stub
 87         //timeTextView.setText(time);
 88     }
 89 
 90 
 91 
 92     @Override
 93     public boolean onTouchEvent(MotionEvent event) {
 94 
 95         int y= (int) event.getRawY();
 96 
 97 
 98         switch (event.getAction()) {
 99             case MotionEvent.ACTION_DOWN:
100                 //記錄下y坐標
101                 lastY = y;
102                 break;
103 
104             case MotionEvent.ACTION_MOVE:
105                 Log.i(TAG, "ACTION_MOVE");
106                 //y移動坐標
107                 int m = y - lastY;
108                 if(((m < 6) && (m > -1)) || (!isDragging )){
109                     doMovement(m);
110                 }
111                 //記錄下此刻y坐標
112                 this.lastY = y;
113                 break;
114 
115             case MotionEvent.ACTION_UP:
116                 Log.i(TAG, "ACTION_UP");
117 
118                 fling();
119 
120                 break;
121         }
122         return true;
123     }
124 
125 
126     /**
127      * up事件處理
128      */
129     private void fling() {
130         // TODO Auto-generated method stub
131         LinearLayout.LayoutParams lp = (LayoutParams) refreshView.getLayoutParams();
132         Log.i(TAG, "fling()" + lp.topMargin);
133         if(lp.topMargin > 0){//拉到了觸發可刷新事件
134             refresh();        
135         }else{
136             returnInitState();
137         }
138     }
139 
140 
141 
142     private void returnInitState() {
143         // TODO Auto-generated method stub
144         LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
145         int i = lp.topMargin;
146         scroller.startScroll(0, i, 0, refreshTargetTop);
147         invalidate();
148     }
149     private void refresh() {
150         // TODO Auto-generated method stub
151         LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
152         int i = lp.topMargin;
153         refreshIndicatorView.setVisibility(View.GONE);
154         bar.setVisibility(View.VISIBLE);
155         timeTextView.setVisibility(View.GONE);
156         downTextView.setVisibility(View.GONE);
157         scroller.startScroll(0, i, 0, 0-i);
158         invalidate();
159         if(refreshListener !=null){
160             refreshListener.onRefresh(this);
161             isRefreshing = true;
162         }
163     }
164 
165     /**
166      * 
167      */
168     @Override
169     public void computeScroll() {
170         // TODO Auto-generated method stub
171         if(scroller.computeScrollOffset()){
172             int i = this.scroller.getCurrY();
173             LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
174             int k = Math.max(i, refreshTargetTop);
175             lp.topMargin = k;
176             this.refreshView.setLayoutParams(lp);
177             this.refreshView.invalidate();
178             invalidate();
179         }
180     }
181     /**
182      * 下拉move事件處理
183      * @param moveY
184      */
185     private void doMovement(int moveY) {
186         // TODO Auto-generated method stub
187         LinearLayout.LayoutParams lp = (LayoutParams) refreshView.getLayoutParams();
188         if(moveY > 0){
189             //獲取view的上邊距
190             float f1 =lp.topMargin;
191             float f2 = moveY * 0.3F;
192             int i = (int)(f1+f2);
193             //修改上邊距
194             lp.topMargin = i;
195             //修改後刷新
196             refreshView.setLayoutParams(lp);
197             refreshView.invalidate();
198             invalidate();
199         }
200         timeTextView.setVisibility(View.VISIBLE);
201         if(refreshTime!= null){
202             setRefreshTime(refreshTime);
203         }
204         downTextView.setVisibility(View.VISIBLE);
205 
206         refreshIndicatorView.setVisibility(View.VISIBLE);
207         bar.setVisibility(View.GONE);
208         if(lp.topMargin >  0){
209             downTextView.setText(R.string.refresh_release_text);
210             refreshIndicatorView.setImageResource(R.drawable.refresh_arrow_up);
211         }else{
212             downTextView.setText(R.string.refresh_down_text);
213             refreshIndicatorView.setImageResource(R.drawable.refresh_arrow_down);
214         }
215 
216     }
217 
218     public void setRefreshEnabled(boolean b) {
219         this.isRefreshEnabled = b;
220     }
221 
222     public void setRefreshListener(RefreshListener listener) {
223         this.refreshListener = listener;
224     }
225 
226     /**
227      * 刷新時間
228      * @param refreshTime2
229      */
230     private void setRefreshTime(Long time) {
231         // TODO Auto-generated method stub
232 
233     }
234 
235     /**
236      * 結束刷新事件
237      */
238     public void finishRefresh(){
239         Log.i(TAG, "執行了=====finishRefresh");
240         LinearLayout.LayoutParams lp= (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
241         int i = lp.topMargin;
242         refreshIndicatorView.setVisibility(View.VISIBLE);
243         timeTextView.setVisibility(View.VISIBLE);
244         scroller.startScroll(0, i, 0, refreshTargetTop);
245         invalidate();
246         isRefreshing = false;  
247     }
248 
249 
250     /*該方法一般和ontouchEvent 一起用
251      * (non-Javadoc)
252      * @see android.view.ViewGroup#onInterceptTouchEvent(android.view.MotionEvent)
253      */
254     @Override
255     public boolean onInterceptTouchEvent(MotionEvent e) {
256         // TODO Auto-generated method stub
257         int action = e.getAction();
258         int y= (int) e.getRawY();
259         switch (action) {
260             case MotionEvent.ACTION_DOWN:
261                 lastY = y;
262                 break;
263 
264             case MotionEvent.ACTION_MOVE:
265                 //y移動坐標
266                 int m = y - lastY;
267 
268                 //記錄下此刻y坐標
269                 this.lastY = y;
270                 if(m > 6 &&  canScroll()){
271                     return true;
272                 }
273                 break;
274             case MotionEvent.ACTION_UP:
275 
276                 break;
277 
278             case MotionEvent.ACTION_CANCEL:
279 
280                 break;
281         }
282         return false;
283     }
284     private boolean canScroll() {
285         // TODO Auto-generated method stub
286         View childView;
287         if(getChildCount()>1){
288             childView = this.getChildAt(1);
289             if(childView instanceof ListView){
290                 int top =((ListView)childView).getChildAt(0).getTop(); 
291                 int pad =((ListView)childView).getListPaddingTop(); 
292                 if((Math.abs(top-pad)) < 3&&
293                    ((ListView) childView).getFirstVisiblePosition() == 0){
294                     return true;
295                 }else{
296                     return false;
297                 }
298             }else if(childView instanceof ScrollView){
299                 if(((ScrollView)childView).getScrollY() == 0){
300                     return true;
301                 }else{
302                     return false;
303                 }
304             }
305 
306         }
307         return false;
308     }
309     /**
310      * 刷新監聽接口
311      * @author Nono
312      *
313      */
314     public interface RefreshListener{
315         public void onRefresh(RefreshableView view);
316     }}

 

posted @ 2015-05-16 21:26  少於無  阅读(178)  评论(0)    收藏  举报