哈哈,终于把滑动栏做好了,但是没有手势的滑动,只有点击按钮的效果,不过,我觉得还不错了!
这个就是我应用中用到的滑动栏的效果!,在这里我就share一下咯!
大家看代码就知道他的详细情况了:
这里我们有一个主类,这里会有两个布局文件与它相连:
这里显示main_slide布局文件:
请记住这里要用到framlayout哦!
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 5 android:layout_width="fill_parent" 6 7 android:layout_height="fill_parent" 8 9 android:background="#ffffff" > 10 11 12 13 <!-- 左边菜单 --> 14 15 16 17 <RelativeLayout 18 19 xmlns:android="http://schemas.android.com/apk/res/android" 20 21 android:id="@+id/leftmenu" 22 23 android:layout_width="250dip" 24 25 android:layout_height="fill_parent" 26 27 android:background="@drawable/background" 28 29 android:orientation="vertical" 30 31 android:visibility="invisible" > 32 33 34 35 <ImageView 36 37 android:id="@+id/imgHander" 38 39 android:layout_width="90dip" 40 41 android:layout_height="90dip" 42 43 android:layout_centerHorizontal="true" 44 45 android:layout_marginTop="20dip" /> 46 47 48 49 <TextView 50 51 android:id="@+id/text_name" 52 53 android:layout_width="wrap_content" 54 55 android:layout_height="wrap_content" 56 57 android:layout_below="@id/imgHander" 58 59 android:layout_centerHorizontal="true" 60 61 android:layout_marginTop="10dip" 62 63 android:text="Catherine" 64 65 android:textColor="#fff" 66 67 android:textSize="25sp" 68 69 android:textStyle="bold" /> 70 71 72 73 <TextView 74 75 android:id="@+id/text_moto" 76 77 android:layout_width="wrap_content" 78 79 android:layout_height="wrap_content" 80 81 android:layout_below="@id/text_name" 82 83 android:layout_centerHorizontal="true" 84 85 android:text="you never know that" 86 87 android:textColor="#fff" 88 89 android:textSize="15sp" 90 91 android:textStyle="bold" /> 92 93 94 95 <Button 96 97 android:id="@+id/btn_fav" 98 99 android:layout_width="230dip" 100 101 android:layout_height="40dip" 102 103 android:layout_below="@id/text_moto" 104 105 android:layout_centerHorizontal="true" 106 107 android:layout_marginTop="30dip" 108 109 android:background="@drawable/favourite" /> 110 111 112 113 <Button 114 115 android:id="@+id/btn_set" 116 117 android:layout_width="230dip" 118 119 android:layout_height="40dip" 120 121 android:layout_below="@id/btn_fav" 122 123 android:layout_centerHorizontal="true" 124 125 android:layout_marginTop="5dip" 126 127 android:background="@drawable/setting" /> 128 129 130 131 <Button 132 133 android:id="@+id/btn_com" 134 135 android:layout_width="230dip" 136 137 android:layout_height="40dip" 138 139 android:layout_below="@id/btn_set" 140 141 android:layout_centerHorizontal="true" 142 143 android:layout_marginTop="5dip" 144 145 android:background="@drawable/comment" /> 146 147 148 149 <Button 150 151 android:id="@+id/btn_pro" 152 153 android:layout_width="230dip" 154 155 android:layout_height="40dip" 156 157 android:layout_below="@id/btn_com" 158 159 android:layout_centerHorizontal="true" 160 161 android:layout_marginTop="5dip" 162 163 android:background="@drawable/profile" /> 164 165 </RelativeLayout> 166 167 168 169 <grimbo.android.demo.slidingmenu.MyHorizontalScrollView 170 171 android:id="@+id/myScrollView" 172 173 android:layout_width="fill_parent" 174 175 android:layout_height="fill_parent" 176 177 android:fadingEdge="none" 178 179 android:scrollbars="none" > 180 181 182 183 <!-- 184 185 这里按钮就是控制滑图案出来的背景颜色,当然,如果这里没有了背景颜色,就会以上面的 186 187 背景颜色为主 188 189 --> 190 191 192 193 <LinearLayout 194 195 android:id="@+id/top" 196 197 android:layout_width="fill_parent" 198 199 android:layout_height="fill_parent" 200 201 android:orientation="horizontal" > 202 203 </LinearLayout> 204 205 </grimbo.android.demo.slidingmenu.MyHorizontalScrollView> 206 207 208 209 </FrameLayout>
接下来就是main布局文件:这个布局文件就是显示我们当前不做任何操作显示的界面:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 5 android:id="@+id/app" 6 7 android:layout_width="fill_parent" 8 9 android:layout_height="wrap_content" 10 11 android:background="#00f" 12 13 android:orientation="vertical" > 14 15 16 17 <RelativeLayout 18 19 android:layout_width="fill_parent" 20 21 android:layout_height="wrap_content" 22 23 android:orientation="horizontal" 24 25 android:paddingLeft="2dip" 26 27 android:paddingTop="4dip" 28 29 > 30 31 32 33 <ImageView 34 35 android:id="@+id/leftButton" 36 37 android:layout_width="60dip" 38 39 android:layout_height="60dip" /> 40 41 </RelativeLayout> 42 43 44 45 </LinearLayout> 46 47 48 49
这里就是主类:
1 package grimbo.android.demo.slidingmenu; 2 3 4 5 import cn.android.app.R; 6 7 import android.app.Activity; 8 9 import android.graphics.Bitmap; 10 11 import android.graphics.Bitmap.Config; 12 13 import android.graphics.BitmapFactory; 14 15 import android.graphics.Canvas; 16 17 import android.graphics.Color; 18 19 import android.graphics.Paint; 20 21 import android.graphics.PorterDuff.Mode; 22 23 import android.graphics.PorterDuffXfermode; 24 25 import android.graphics.Rect; 26 27 import android.graphics.RectF; 28 29 import android.os.Bundle; 30 31 import android.view.LayoutInflater; 32 33 import android.view.View; 34 35 import android.widget.ImageView; 36 37 38 39 /** 40 41 * This example uses a FrameLayout to display a menu View and a 42 43 * HorizontalScrollView (HSV). 44 45 * 46 47 * The HSV has a transparent View as the first child, which means the menu will 48 49 * show through when the HSV is scrolled. 50 51 */ 52 53 public class MainActivity extends Activity { 54 55 private MyHorizontalScrollView scrollView; 56 57 private View leftMenu; 58 59 // private View rightMenu; 60 61 62 63 private View tab01; 64 65 private ImageView leftButton; 66 67 68 69 // private Button rightButton; 70 71 72 73 @Override 74 75 public void onCreate(Bundle savedInstanceState) { 76 77 super.onCreate(savedInstanceState); 78 79 80 81 LayoutInflater inflater = LayoutInflater.from(this); 82 83 setContentView(inflater.inflate(R.layout.main_slide, null)); 84 85 86 87 scrollView = (MyHorizontalScrollView) findViewById(R.id.myScrollView); 88 89 leftMenu = findViewById(R.id.leftmenu); 90 91 // rightMenu = findViewById(R.id.rightmenu); 92 93 94 95 tab01 = inflater.inflate(R.layout.tab01, null); 96 97 leftButton = (ImageView) main.findViewById(R.id.leftButton); 98 99 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 100 101 R.drawable.ic_launcher); 102 103 Bitmap output = getRoundedCornerBitmap(bitmap); 104 105 leftButton.setImageBitmap(output); 106 107 108 109 leftButton.setOnClickListener(new View.OnClickListener() { 110 111 112 113 @Override 114 115 public void onClick(View v) { 116 117 scrollView.clickLeftButton(leftButton.getMeasuredWidth()); 118 119 } 120 121 }); 122 123 124 125 // 以上的代码是设置我的头像为圆形的,以前找了好久,才知道,一句代码就ok啦!好吧,我 126 127 // 又想错了,其实还是需要很多的代码 128 129 130 131 View leftView = new View(this);// 左边透明视图 132 133 // View rightView = new View(this);// 右边透明视图 134 135 leftView.setBackgroundColor(Color.TRANSPARENT); 136 137 // rightView.setBackgroundColor(Color.TRANSPARENT); 138 139 // final View[] children = new View[] { leftView, tab01,rightView }; 140 141 final View[] children = new View[] { leftView, tab01 }; 142 143 // 初始化滚动布局 144 145 // scrollView.initViews(children, new 146 147 // SizeCallbackForMenu(leftButton),leftMenu,rightMenu); 148 149 scrollView.initViews(children, new SizeCallbackForMenu(leftButton), 150 151 leftMenu); 152 153 } 154 155 156 157 /** 158 159 * 圆形头像 160 161 * 162 163 * @param bitmap 164 165 * @param ratio 166 167 * 按照截取比例来获取圆形图片 168 169 * @return 170 171 */ 172 173 public Bitmap getRoundedCornerBitmap(Bitmap bitmap) { 174 175 if (bitmap == null) { 176 177 bitmap = BitmapFactory.decodeResource(getResources(), 178 179 R.drawable.ic_launcher); 180 181 } 182 183 Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), 184 185 bitmap.getHeight(), Config.ARGB_8888); 186 187 Canvas canvas = new Canvas(outBitmap); 188 189 final int color = 0xff424242; 190 191 final Paint paint = new Paint(); 192 193 final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 194 195 final RectF rectF = new RectF(rect); 196 197 final float roundPX = bitmap.getWidth() / 2 < bitmap.getHeight() / 2 ? bitmap 198 199 .getWidth() : bitmap.getHeight(); 200 201 paint.setAntiAlias(true); 202 203 canvas.drawARGB(0, 0, 0, 0); 204 205 paint.setColor(color); 206 207 canvas.drawRoundRect(rectF, roundPX, roundPX, paint); 208 209 paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 210 211 canvas.drawBitmap(bitmap, rect, rect, paint); 212 213 return outBitmap; 214 215 } 216 217 218 219 } 220 221 222 223 224 225
这里是另外一个类,这些都是打辅助的了:
1 package grimbo.android.demo.slidingmenu; 2 3 4 5 import android.content.Context; 6 7 import android.os.Handler; 8 9 import android.util.AttributeSet; 10 11 import android.util.Log; 12 13 import android.view.GestureDetector; 14 15 import android.view.GestureDetector.SimpleOnGestureListener; 16 17 import android.view.MotionEvent; 18 19 import android.view.VelocityTracker; 20 21 import android.view.View; 22 23 import android.view.ViewGroup; 24 25 import android.view.GestureDetector.OnGestureListener; 26 27 import android.view.ViewTreeObserver.OnGlobalLayoutListener; 28 29 import android.widget.HorizontalScrollView; 30 31 import android.widget.Scroller; 32 33 34 35 /** 36 37 * A HorizontalScrollView (HSV) implementation that disallows touch events (so no scrolling can be done by the user). 38 39 * 40 41 * This HSV MUST contain a single ViewGroup as its only child, and this ViewGroup will be used to display the children Views 42 43 * passed in to the initViews() method. 44 45 */ 46 47 public class HomePageHorizontalScrollView extends HorizontalScrollView { 48 49 50 51 private final String tag = "MyHorizontalScrollView"; 52 53 54 55 private HomePageHorizontalScrollView me;//当前控件 56 57 private View leftMenu;//左边菜单 58 59 private View rightMenu;//右边菜单 60 61 private boolean leftMenuOut = false;//左边菜单状态 62 63 private boolean rightMenuOut = false;//左边菜单状态 64 65 private final int ENLARGE_WIDTH = 20;//扩展宽度 66 67 68 69 public HomePageHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) { 70 71 super(context, attrs, defStyle); 72 73 init(context); 74 75 } 76 77 78 79 public HomePageHorizontalScrollView(Context context, AttributeSet attrs) { 80 81 super(context, attrs); 82 83 init(context); 84 85 } 86 87 88 89 public HomePageHorizontalScrollView(Context context) { 90 91 super(context); 92 93 init(context); 94 95 } 96 97 98 99 void init(Context context) { 100 101 // remove the fading as the HSV looks better without it 102 103 setHorizontalFadingEdgeEnabled(false); 104 105 setVerticalFadingEdgeEnabled(false); 106 107 me = this; 108 109 me.setVisibility(View.INVISIBLE); 110 111 } 112 113 114 115 116 117 /** 118 119 * @param children 120 121 * The child Views to add to parent. 122 123 * @param scrollToViewIdx 124 125 * The index of the View to scroll to after initialisation. 126 127 * @param sizeCallback 128 129 * A SizeCallback to interact with the HSV. 130 131 */ 132 133 public void initViews(View[] children, SizeCallback sizeCallback,View leftMenu,View rightMenu) { 134 135 this.leftMenu = leftMenu; 136 137 this.rightMenu = rightMenu; 138 139 ViewGroup parent = (ViewGroup) getChildAt(0); 140 141 142 143 // Add all the children, but add them invisible so that the layouts are calculated, but you can't see the Views 144 145 for (int i = 0; i < children.length; i++) { 146 147 children[i].setVisibility(View.INVISIBLE); 148 149 parent.addView(children[i]); 150 151 } 152 153 154 155 // Add a layout listener to this HSV 156 157 // This listener is responsible for arranging the child views. 158 159 OnGlobalLayoutListener listener = new MyOnGlobalLayoutListener(parent, children, sizeCallback); 160 161 getViewTreeObserver().addOnGlobalLayoutListener(listener); 162 163 } 164 165 166 167 168 169 170 171 172 173 174 175 @Override 176 177 public boolean onInterceptTouchEvent(MotionEvent ev) { 178 179 // Do not allow touch events. 180 181 return false; 182 183 } 184 185 186 187 /** 188 189 * An OnGlobalLayoutListener impl that passes on the call to onGlobalLayout to a SizeCallback, before removing all the Views 190 191 * in the HSV and adding them again with calculated widths and heights. 192 193 */ 194 195 class MyOnGlobalLayoutListener implements OnGlobalLayoutListener { 196 197 ViewGroup parent; 198 199 View[] children; 200 201 int scrollToViewPos = 0; 202 203 SizeCallback sizeCallback; 204 205 206 207 /** 208 209 * @param parent 210 211 * The parent to which the child Views should be added. 212 213 * @param children 214 215 * The child Views to add to parent. 216 217 * @param scrollToViewIdx 218 219 * The index of the View to scroll to after initialisation. 220 221 * @param sizeCallback 222 223 * A SizeCallback to interact with the HSV. 224 225 */ 226 227 public MyOnGlobalLayoutListener(ViewGroup parent, View[] children, SizeCallback sizeCallback) { 228 229 this.parent = parent; 230 231 this.children = children; 232 233 this.sizeCallback = sizeCallback; 234 235 } 236 237 238 239 @Override 240 241 public void onGlobalLayout() { 242 243 // System.out.println("onGlobalLayout"); 244 245 246 247 //final HorizontalScrollView me = MyHorizontalScrollView.this; 248 249 250 251 // The listener will remove itself as a layout listener to the HSV 252 253 me.getViewTreeObserver().removeGlobalOnLayoutListener(this); 254 255 256 257 // Allow the SizeCallback to 'see' the Views before we remove them and re-add them. 258 259 // This lets the SizeCallback prepare View sizes, ahead of calls to SizeCallback.getViewSize(). 260 261 sizeCallback.onGlobalLayout(); 262 263 264 265 parent.removeViewsInLayout(0, children.length); 266 267 268 269 final int w = me.getMeasuredWidth(); 270 271 final int h = me.getMeasuredHeight(); 272 273 274 275 // System.out.println("w=" + w + ", h=" + h); 276 277 278 279 // Add each view in turn, and apply the width and height returned by the SizeCallback. 280 281 int[] dims = new int[2]; 282 283 scrollToViewPos = 0; 284 285 for (int i = 0; i < children.length; i++) { 286 287 sizeCallback.getViewSize(i, w, h, dims); 288 289 children[i].setVisibility(View.VISIBLE); 290 291 parent.addView(children[i], dims[0], dims[1]); 292 293 if (i == 0) { 294 295 scrollToViewPos += dims[0]; 296 297 } 298 299 Log.d(tag, children[i]+": w=" + dims[0] + ", h=" + dims[1]); 300 301 Log.d(tag, "scrollToViewIdx:"+0+",scrollToViewPos:"+scrollToViewPos); 302 303 } 304 305 306 307 // For some reason we need to post this action, rather than call immediately. 308 309 // If we try immediately, it will not scroll. 310 311 312 313 new Handler().post(new Runnable() { 314 315 @Override 316 317 public void run() { 318 319 me.scrollBy(scrollToViewPos,0); 320 321 //因为这些控件默认都为隐藏,控件加载完成后,设置成显示 322 323 me.setVisibility(View.VISIBLE); 324 325 leftMenu.setVisibility(View.VISIBLE); 326 327 rightMenu.setVisibility(View.VISIBLE); 328 329 } 330 331 }); 332 333 } 334 335 } 336 337 338 339 /** 340 341 * 点击左边按钮 342 343 * @param leftButtonWidth 左边按钮的宽度 344 345 */ 346 347 public void clickLeftButton(int leftButtonWidth){ 348 349 //左边 350 351 rightMenu.setVisibility(View.GONE); 352 353 leftMenu.setVisibility(View.VISIBLE); 354 355 int menuWidth = leftMenu.getMeasuredWidth()-(leftButtonWidth+ENLARGE_WIDTH); 356 357 System.out.println("leftmenuWidth:"+menuWidth); 358 359 if (!leftMenuOut) { 360 361 int left = 0; 362 363 me.smoothScrollTo(left, 0); 364 365 } else { 366 367 int left = menuWidth; 368 369 me.smoothScrollTo(left, 0); 370 371 } 372 373 leftMenuOut = !leftMenuOut; 374 375 } 376 377 378 379 /** 380 381 * 点击右边按钮 382 383 * @param rightButtonWidth 右边按钮的宽度 384 385 */ 386 387 public void clickRightButton(int rightButtonWidth){ 388 389 //右边 390 391 leftMenu.setVisibility(View.GONE); 392 393 rightMenu.setVisibility(View.VISIBLE); 394 395 int menuWidth = rightMenu.getMeasuredWidth() - (rightButtonWidth+ENLARGE_WIDTH); 396 397 if (!rightMenuOut) { 398 399 int right = menuWidth + me.getMeasuredWidth(); 400 401 System.out.println("rightmenuWidth:"+right); 402 403 me.smoothScrollTo(right, 0); 404 405 } else { 406 407 int right = menuWidth; 408 409 System.out.println("rightmenuWidth:"+right); 410 411 me.smoothScrollTo(right, 0); 412 413 } 414 415 rightMenuOut = !rightMenuOut; 416 417 } 418 419 420 421 422 423 424 425 @Override 426 427 public boolean onTouchEvent(MotionEvent ev) { 428 429 // TODO Auto-generated method stub 430 431 //return super.onTouchEvent(ev); 432 433 return false; 434 435 } 436 437 438 439 /** 440 441 * Callback interface to interact with the HSV. 442 443 */ 444 445 public interface SizeCallback { 446 447 /** 448 449 * Used to allow clients to measure Views before re-adding them. 450 451 */ 452 453 public void onGlobalLayout(); 454 455 456 457 /** 458 459 * Used by clients to specify the View dimensions. 460 461 * 462 463 * @param idx 464 465 * Index of the View. 466 467 * @param w 468 469 * Width of the parent View. 470 471 * @param h 472 473 * Height of the parent View. 474 475 * @param dims 476 477 * dims[0] should be set to View width. dims[1] should be set to View height. 478 479 */ 480 481 public void getViewSize(int idx, int w, int h, int[] dims); 482 483 } 484 485 }
在主类里面,我们就会用到水平滚动的一些操作:
1 package grimbo.android.demo.slidingmenu; 2 3 4 5 import android.content.Context; 6 7 import android.os.Handler; 8 9 import android.util.AttributeSet; 10 11 import android.util.Log; 12 13 import android.view.MotionEvent; 14 15 import android.view.View; 16 17 import android.view.ViewGroup; 18 19 import android.view.ViewTreeObserver.OnGlobalLayoutListener; 20 21 import android.widget.HorizontalScrollView; 22 23 24 25 /** 26 27 * A HorizontalScrollView (HSV) implementation that disallows touch events (so 28 29 * no scrolling can be done by the user). 30 31 * 32 33 * This HSV MUST contain a single ViewGroup as its only child, and this 34 35 * ViewGroup will be used to display the children Views passed in to the 36 37 * initViews() method. 38 39 */ 40 41 public class MyHorizontalScrollView extends HorizontalScrollView { 42 43 44 45 private final String tag = "MyHorizontalScrollView"; 46 47 48 49 private MyHorizontalScrollView me;// 当前控件 50 51 private View leftMenu;// 左边菜单 52 53 private boolean leftMenuOut = false;// 左边菜单状态 54 55 private final int ENLARGE_WIDTH = 20;// 扩展宽度 56 57 58 59 public MyHorizontalScrollView(Context context, AttributeSet attrs, 60 61 int defStyle) { 62 63 super(context, attrs, defStyle); 64 65 init(context); 66 67 } 68 69 70 71 public MyHorizontalScrollView(Context context, AttributeSet attrs) { 72 73 super(context, attrs); 74 75 init(context); 76 77 } 78 79 80 81 public MyHorizontalScrollView(Context context) { 82 83 super(context); 84 85 init(context); 86 87 } 88 89 90 91 void init(Context context) { 92 93 // remove the fading as the HSV looks better without it 94 95 setHorizontalFadingEdgeEnabled(false); 96 97 setVerticalFadingEdgeEnabled(false); 98 99 me = this; 100 101 me.setVisibility(View.INVISIBLE); 102 103 } 104 105 106 107 /** 108 109 * @param children 110 111 * The child Views to add to parent. 112 113 * @param scrollToViewIdx 114 115 * The index of the View to scroll to after initialisation. 116 117 * @param sizeCallback 118 119 * A SizeCallback to interact with the HSV. 120 121 */ 122 123 public void initViews(View[] children, SizeCallback sizeCallback, 124 125 View leftMenu) { 126 127 this.leftMenu = leftMenu; 128 129 ViewGroup parent = (ViewGroup) getChildAt(0); 130 131 132 133 // Add all the children, but add them invisible so that the layouts are 134 135 // calculated, but you can't see the Views 136 137 for (int i = 0; i < children.length; i++) { 138 139 children[i].setVisibility(View.INVISIBLE); 140 141 parent.addView(children[i]); 142 143 } 144 145 146 147 // Add a layout listener to this HSV 148 149 // This listener is responsible for arranging the child views. 150 151 OnGlobalLayoutListener listener = new MyOnGlobalLayoutListener(parent, 152 153 children, sizeCallback); 154 155 getViewTreeObserver().addOnGlobalLayoutListener(listener); 156 157 } 158 159 160 161 @Override 162 163 public boolean onInterceptTouchEvent(MotionEvent ev) { 164 165 return false; 166 167 } 168 169 170 171 /** 172 173 * An OnGlobalLayoutListener impl that passes on the call to onGlobalLayout 174 175 * to a SizeCallback, before removing all the Views in the HSV and adding 176 177 * them again with calculated widths and heights. 178 179 */ 180 181 class MyOnGlobalLayoutListener implements OnGlobalLayoutListener { 182 183 ViewGroup parent; 184 185 View[] children; 186 187 int scrollToViewPos = 0; 188 189 SizeCallback sizeCallback; 190 191 192 193 /** 194 195 * @param parent 196 197 * The parent to which the child Views should be added. 198 199 * @param children 200 201 * The child Views to add to parent. 202 203 * @param scrollToViewIdx 204 205 * The index of the View to scroll to after initialisation. 206 207 * @param sizeCallback 208 209 * A SizeCallback to interact with the HSV. 210 211 */ 212 213 public MyOnGlobalLayoutListener(ViewGroup parent, View[] children, 214 215 SizeCallback sizeCallback) { 216 217 this.parent = parent; 218 219 this.children = children; 220 221 this.sizeCallback = sizeCallback; 222 223 } 224 225 226 227 @Override 228 229 public void onGlobalLayout() { 230 231 // System.out.println("onGlobalLayout"); 232 233 234 235 // final HorizontalScrollView me = MyHorizontalScrollView.this; 236 237 238 239 // The listener will remove itself as a layout listener to the HSV 240 241 me.getViewTreeObserver().removeGlobalOnLayoutListener(this); 242 243 244 245 // Allow the SizeCallback to 'see' the Views before we remove them 246 247 // and re-add them. 248 249 // This lets the SizeCallback prepare View sizes, ahead of calls to 250 251 // SizeCallback.getViewSize(). 252 253 sizeCallback.onGlobalLayout(); 254 255 256 257 parent.removeViewsInLayout(0, children.length); 258 259 260 261 final int w = me.getMeasuredWidth(); 262 263 final int h = me.getMeasuredHeight(); 264 265 266 267 // System.out.println("w=" + w + ", h=" + h); 268 269 270 271 // Add each view in turn, and apply the width and height returned by 272 273 // the SizeCallback. 274 275 int[] dims = new int[2]; 276 277 scrollToViewPos = 0; 278 279 for (int i = 0; i < children.length; i++) { 280 281 sizeCallback.getViewSize(i, w, h, dims); 282 283 children[i].setVisibility(View.VISIBLE); 284 285 parent.addView(children[i], dims[0], dims[1]); 286 287 if (i == 0) { 288 289 scrollToViewPos += dims[0]; 290 291 } 292 293 Log.d(tag, children[i] + ": w=" + dims[0] + ", h=" + dims[1]); 294 295 Log.d(tag, "scrollToViewIdx:" + 0 + ",scrollToViewPos:" 296 297 + scrollToViewPos); 298 299 } 300 301 302 303 // For some reason we need to post this action, rather than call 304 305 // immediately. 306 307 // If we try immediately, it will not scroll. 308 309 310 311 new Handler().post(new Runnable() { 312 313 @Override 314 315 public void run() { 316 317 me.scrollBy(scrollToViewPos, 0); 318 319 // 因为这些控件默认都为隐藏,控件加载完成后,设置成显示 320 321 me.setVisibility(View.VISIBLE); 322 323 leftMenu.setVisibility(View.VISIBLE); 324 325 } 326 327 }); 328 329 } 330 331 } 332 333 334 335 /** 336 337 * 点击左边按钮 338 339 * 340 341 * @param leftButtonWidth 342 343 * 左边按钮的宽度 344 345 */ 346 347 public void clickLeftButton(int leftButtonWidth) { 348 349 // 左边 350 351 leftMenu.setVisibility(View.VISIBLE); 352 353 int menuWidth = 90+leftMenu.getMeasuredWidth() 354 355 - (leftButtonWidth + ENLARGE_WIDTH); 356 357 System.out.println("leftmenuWidth:" + menuWidth); 358 359 if (!leftMenuOut) { 360 361 int left = 0; 362 363 me.smoothScrollTo(left, 0); 364 365 } else { 366 367 int left = menuWidth; 368 369 me.smoothScrollTo(left, 0); 370 371 } 372 373 leftMenuOut = !leftMenuOut; 374 375 } 376 377 378 379 380 381 @Override 382 383 public boolean onTouchEvent(MotionEvent ev) { 384 385 // TODO Auto-generated method stub 386 387 // return super.onTouchEvent(ev); 388 389 return false; 390 391 } 392 393 394 395 /** 396 397 * Callback interface to interact with the HSV. 398 399 */ 400 401 public interface SizeCallback { 402 403 /** 404 405 * Used to allow clients to measure Views before re-adding them. 406 407 */ 408 409 public void onGlobalLayout(); 410 411 412 413 /** 414 415 * Used by clients to specify the View dimensions. 416 417 * 418 419 * @param idx 420 421 * Index of the View. 422 423 * @param w 424 425 * Width of the parent View. 426 427 * @param h 428 429 * Height of the parent View. 430 431 * @param dims 432 433 * dims[0] should be set to View width. dims[1] should be set 434 435 * to View height. 436 437 */ 438 439 public void getViewSize(int idx, int w, int h, int[] dims); 440 441 } 442 443 } 444 445 这里还会有一些对当前界面滑动后的界面美观维护类: 446 447 package grimbo.android.demo.slidingmenu; 448 449 450 451 import grimbo.android.demo.slidingmenu.MyHorizontalScrollView.SizeCallback; 452 453 import android.widget.ImageView; 454 455 456 457 /** 458 459 * Copyright (c) 2011, 460 461 * All rights reserved. 462 463 * 类说明 464 465 * @author 许美镇 466 467 * @version Revision:1.0 Date:(2012-5-22) 468 469 * 470 471 */ 472 473 public class SizeCallbackForMenu implements SizeCallback { 474 475 private ImageView leftButton; 476 477 private int leftButtonWidth; 478 479 480 481 public SizeCallbackForMenu(ImageView leftButton) { 482 483 super(); 484 485 this.leftButton = leftButton; 486 487 } 488 489 490 491 @Override 492 493 public void onGlobalLayout() { 494 495 leftButtonWidth = leftButton.getMeasuredWidth()+8; 496 497 System.out.println("leftButtonWidth=" + leftButtonWidth); 498 499 } 500 501 502 503 @Override 504 505 public void getViewSize(int idx, int w, int h, int[] dims) { 506 507 dims[0] = w; 508 509 dims[1] = h; 510 511 if (idx != 1) { 512 513 //当视图不是中间的视图 514 515 dims[0] = w - leftButtonWidth; 516 517 } 518 519 } 520 521 } 522 523 524 525 526 527 这里其实对于大家最重要的就是动画了,所以这里我把动画公布了: 528 529 530 531 这里面的代码依次为: 532 533 534 535 536 537 第一个: 538 539 540 541 <?xml version="1.0" encoding="utf-8"?> 542 543 544 545 <set xmlns:android="http://schemas.android.com/apk/res/android"> 546 547 <translate android:fromXDelta="80%p" android:toXDelta="0" android:duration="500"/> 548 549 <!--alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /--> 550 551 </set> 552 553 554 555 第二个: 556 557 <?xml version="1.0" encoding="utf-8"?> 558 559 560 561 <set xmlns:android="http://schemas.android.com/apk/res/android"> 562 563 <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="500"/> 564 565 <!--alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /--> 566 567 </set> 568 569 第三个: 570 571 <?xml version="1.0" encoding="utf-8"?> 572 573 <set xmlns:android="http://schemas.android.com/apk/res/android"> 574 575 <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="500"/> 576 577 <!--alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" /--> 578 579 </set> 580 581 第四个: 582 583 <?xml version="1.0" encoding="utf-8"?> 584 585 <set xmlns:android="http://schemas.android.com/apk/res/android"> 586 587 <translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="500"/> 588 589 <!--alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /--> 590 591 </set> 592 593 第五个: 594 595 <?xml version="1.0" encoding="utf-8"?> 596 597 <set xmlns:android="http://schemas.android.com/apk/res/android"> 598 599 <translate android:fromXDelta="0" android:toXDelta="80%p" android:duration="500"/> 600 601 <!--alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" /--> 602 603 </ 604 605 第六个: 606 607 <?xml version="1.0" encoding="utf-8"?> 608 609 610 611 <set xmlns:android="http://schemas.android.com/apk/res/android"> 612 613 <translate android:fromXDelta="0" android:toXDelta="100%p" android:duration="500"/> 614 615 <!--alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" /--> 616 617 </set>
但是鉴于这么多的代码,毕竟很无趣嘛,我会看情况吧源码贴出来的!谢谢支持哦!有什么好的建议随便说了!