安卓中級教程(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 }}
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号