如下图是侧滑的效果图
images/loading.gif' data-original="http://images2015.cnblogs.com/blog/781624/201602/781624-20160216093715986-132133047.png" />
实现的功能主要是用ViewDragHelper,用ViewDragHelper来自定义一个侧滑面板来实现侧滑
如下是自定义的侧滑面板
1 package com.demo.sb.widget; 2 3 import com.nineoldandroids.view.ViewHelper; 4 5 import android.content.Context; 6 import android.graphics.Color; 7 import android.graphics.PorterDuff.Mode; 8 import android.support.v4.view.ViewCompat; 9 import android.support.v4.widget.ViewDragHelper; 10 import android.util.AttributeSet; 11 import android.util.Log; 12 import android.view.MotionEvent; 13 import android.view.View; 14 import android.view.ViewGroup; 15 import android.widget.FrameLayout; 16 17 /** 18 * 侧滑面板 19 * 20 * @author Administrator 21 * 22 */ 23 public class DragLayout extends FrameLayout { 24 25 private ViewDragHelper mDragHelper; 26 private ViewGroup mLeftContent; 27 private ViewGroup mMainContent; 28 29 private Status mStatus = Status.Close; 30 private OnDragStatusChangeListener mListener; 31 32 /** 33 * 状态枚举 34 */ 35 public static enum Status { 36 Close, Open, Draging; 37 } 38 39 public interface OnDragStatusChangeListener { 40 void onClose(); 41 42 void onOpen(); 43 44 void onDraging(float percent); 45 } 46 47 public Status getStatus() { 48 return mStatus; 49 } 50 51 public void setStatus(Status mStatus) { 52 this.mStatus = mStatus; 53 } 54 55 public void setDragStatusListener(OnDragStatusChangeListener mListener) { 56 this.mListener = mListener; 57 } 58 59 public DragLayout(Context context) { 60 this(context, null); 61 // TODO Auto-generated constructor stub 62 } 63 64 public DragLayout(Context context, AttributeSet attrs) { 65 this(context, attrs, 0); 66 // TODO Auto-generated constructor stub 67 } 68 69 public DragLayout(Context context, AttributeSet attrs, int defStyle) { 70 super(context, attrs, defStyle); 71 // TODO Auto-generated constructor stub 72 /** 73 * a . 初始化(通过静态的方法) 74 */ 75 mDragHelper = ViewDragHelper.create(this, mCallback); 76 } 77 78 /** 79 * c. 重写Callback的事件 80 */ 81 ViewDragHelper.Callback mCallback = new ViewDragHelper.Callback() { 82 /** 83 * 1. 根据返回结果决定当前的child是否可以拖拽 child 当前被拖拽的View pointerId 区分多点触摸的id 84 */ 85 @Override 86 public boolean tryCaptureView(View child, int pointerId) { 87 Log.d("jiejie", "tryCaptureView: " + child); 88 return true;// 都可以尝试被拖拽 89 // return child == mMainContent;//只有主程序的View可以被拖拽 90 } 91 92 public void onViewCaptured(View capturedChild, int activePointerId) { 93 // 当capturedChild被捕获时,调用 94 Log.d("jiejie", "onViewCaptured: " + capturedChild); 95 } 96 97 public int getViewHorizontalDragRange(View child) { 98 // 返回拖拽的范围,不对拖拽进行真正的限制。仅仅决定了动画的执行速度 99 return mRange;100 }101 102 /**103 * 2. 根据建议值 修正将要移动到的(横向)位置(重要) 此时还没有真正移动104 */105 public int clampViewPositionHorizontal(View child, int left, int dx) {106 Log.d("jiejie", "clampViewPositionHorizontal: " + left);107 if (child == mMainContent) {108 left = fixLeft(left);109 }110 return left;111 }112 113 /**114 * 3. 当View位置改变的时候,处理要做的事情(更新状态, 伴随动画, 重绘界面) 此时,View已经发生了位置的改变115 * changedView 改变位置的View left 新的左边值 dx 水平方向变化量116 */117 public void onViewPositionChanged(View changedView, int left, int top,118 int dx, int dy) {119 super.onViewPositionChanged(changedView, left, top, dx, dy);120 Log.d("jiejie", "onViewPositionChanged: " + "left:" + left121 + " dx: " + dx);122 int newLeft = left;123 if (changedView == mLeftContent) {124 // 把当前变化量专递给mMainContent125 newLeft = mMainContent.getLeft() + dx;126 }127 // 进行修正128 newLeft = fixLeft(newLeft);129 130 if (changedView == mLeftContent) {131 // 当左面板移动之后,再强制放回去132 mLeftContent.layout(0, 0, 0 + mWidth, 0 + mHeight);133 mMainContent.layout(newLeft, 0, newLeft + mWidth, 0 + mHeight);134 }135 136 /**137 * 更新状态时设置动画(也可以不设置,不设置的话则默认平滑的状态,也可以省很多代码) 设置左面板和主面板,背景的动画138 */139 dispatchDragEvent(newLeft);140 141 // 为了兼容低版本,每次修改值之后,进行重绘142 invalidate();143 }144 145 /**146 * 4. 当View被释放的时候,处理的事情(执行动画) View releasedChild 被释放的子View float xvel147 * 水平方向的速度,向右为正 float yvel 竖直方向的速度, 向下为正148 */149 public void onViewReleased(View releasedChild, float xvel, float yvel) {150 Log.d("jiejie", "onViewReleased: " + "xvel: " + xvel + "yvel: "151 + yvel);152 super.onViewReleased(releasedChild, xvel, yvel);153 // 判断执行 关闭/开启154 // 先考虑所有开启的情况,剩下的就是都是关闭的情况155 if (xvel == 0 && mMainContent.getLeft() > (mRange / 2.0f)) {156 open();157 } else if (xvel > 0) {158 open();159 } else {160 chose();161 }162 }163 164 public void onViewDragStateChanged(int state) {165 super.onViewDragStateChanged(state);166 }167 };168 169 /**170 * 根据范围修正左边值171 * 172 * @param left173 * @return174 */175 private int fixLeft(int left) {176 if (left < 0) {177 return 0;178 } else if (left > mRange) {179 return mRange;180 }181 return left;182 }183 184 /**185 * 执行动画186 * 187 * @param newLeft188 */189 protected void dispatchDragEvent(int newLeft) {190 // TODO Auto-generated method stub191 float percent = newLeft * 1.0f / mRange;192 Log.d("jiejie", "percent: " + percent);193 if (mListener != null) {194 mListener.onDraging(percent);195 }196 197 // 更新状态,执行回调198 Status preStatus = mStatus;199 mStatus = updateStatus(percent);200 201 if (mStatus != preStatus) {202 // 状态发生变化203 if (mStatus == Status.Close) {204 // 当前变为关闭状态205 if (mListener != null) {206 mListener.onClose();207 }208 } else if (mStatus == Status.Open) {209 if (mListener != null) {210 mListener.onOpen();211 }212 }213 }214 215 // 伴随动画216 animViews(percent);217 }218 219 private Status updateStatus(float percent) {220 if (percent == 0f) {221 return Status.Close;222 } else if (percent == 1.0f) {223 return Status.Open;224 }225 return Status.Draging;226 }227 228 private void animViews(float percent) {229 // TODO Auto-generated method stub230 /**231 * >1.左面板:缩放动画,平移动画,透明度动画 缩放动画0.0 - > 1.0 >> 0.5f -> 1.0f >>>232 * 0.5f*percent+0.5f mLeftContent.setScaleX(0.5f + 0.5f * percent);233 * mLeftContent.setScaleY(0.5f + 0.5f * percent);234 */235 // mLeftContent.setScaleY(0.5f + 0.5f * percent);236 // mLeftContent.setScaleX(0.5f + 0.5f * percent);237 ViewHelper.setScaleX(mLeftContent, evaluate(percent, 0.5f, 1.0f));238 ViewHelper.setScaleY(mLeftContent, 0.5f + 0.5f * percent);239 // 平移动画:-mWidth / 2.0 f - > 0.0f240 ViewHelper.setTranslationX(mLeftContent,241 evaluate(percent, -mWidth / 2.0f, 0));242 // 透明度: 0.5 -> 1.0f243 ViewHelper.setAlpha(mLeftContent, evaluate(percent, 0.5f, 1.0f));244 245 /**246 * >2. 主面板:缩放动画247 */248 // 1.0f -> 0.8f249 ViewHelper.setScaleX(mMainContent, evaluate(percent, 1.0f, 0.8f));250 ViewHelper.setScaleY(mMainContent, evaluate(percent, 1.0f, 0.8f));251 252 /**253 * >3. 背景动画: 亮度变化(颜色变化)254 */255 getBackground()256 .setColorFilter(257 (Integer) evaluateColor(percent, Color.BLACK,258 Color.TRANSPARENT), Mode.SRC_OVER);259 }260 261 /**262 * 估值器263 * 264 * @param fraction265 * @param startValue266 * @param endValue267 * @return268 */269 public Float evaluate(float fraction, Number startValue, Number endValue) {270 float startFloat = startValue.floatValue();271 return startFloat + fraction * (endValue.floatValue() - startFloat);272 }273 274 /**275 * 颜色变化过度276 * 277 * @param fraction278 * @param startValue279 * @param endValue280 * @return281 */282 public Object evaluateColor(float fraction, Object startValue,283 Object endValue) {284 int startInt = (Integer) startValue;285 int startA = (startInt >> 24) & 0xff;286 int startR = (startInt >> 16) & 0xff;287 int startG = (startInt >> 8) & 0xff;288 int startB = startInt & 0xff;289 290 int endInt = (Integer) endValue;291 int endA = (endInt >> 24) & 0xff;292 int endR = (endInt >> 16) & 0xff;293 int endG = (endInt >> 8) & 0xff;294 int endB = endInt & 0xff;295 296 return (int) ((startA + (int) (fraction * (endA - startA))) << 24)297 | (int) ((startR + (int) (fraction * (endR - startR))) << 16)298 | (int) ((startG + (int) (fraction * (endG - startG))) << 8)299 | (int) ((startB + (int) (fraction * (endB - startB))));300 }301 302 @Override303 public void computeScroll() {304 // TODO Auto-generated method stub305 super.computeScroll();306 // 2. 持续平滑动画(高频率调用)307 if (mDragHelper.continueSettling(true)) {308 // 如果返回true,动画还需要继续执行309 ViewCompat.postInvalidateOnAnimation(this);310 }311 }312 313 // public void chose() {314 // // TODO Auto-generated method stub315 // chose(true);316 // }317 public void chose() {318 // TODO Auto-generated method stub319 chose(true);320 }321 322 /**323 * 关闭324 * 325 * @param b326 */327 public void chose(boolean isSmooth) {328 // TODO Auto-generated method stub329 int finalLeft = 0;330 // 1. 触发一个平滑动画331 if (isSmooth) {332 if (mDragHelper.smoothSlideViewTo(mMainContent, finalLeft, 0)) {333 // 返回true代表还没有移动到指定位置,需要刷新界面334 // 参数传this(child所在的ViewGroup)335 ViewCompat.postInvalidateOnAnimation(this);336 }337 } else {338 mMainContent.layout(finalLeft, 0, finalLeft + mWidth, 0 + mHeight);339 }340 }341 342 public void open() {343 // TODO Auto-generated method stub344 open(true);345 }346 347 /**348 * 开启349 * 350 * @param b351 */352 public void open(boolean isSmooth) {353 // TODO Auto-generated method stub354 int finalLeft = mRange;355 if (isSmooth) {356 // 1. 触发一个平滑动画357 if (mDragHelper.smoothSlideViewTo(mMainContent, finalLeft, 0)) {358 // 返回true代表还没有移动到指定位置,需要刷新界面359 // 参数this(child所在的ViewGroup)360 ViewCompat.postInvalidateOnAnimation(this);361 }362 } else {363 mMainContent.layout(finalLeft, 0, finalLeft + mWidth, 0 + mHeight);364 }365 }366 367 /**368 * b. 专递触摸事件369 */370 public boolean onInterceptTouchEvent(MotionEvent ev) {371 // 传递给mDragHandler372 return mDragHelper.shouldInterceptTouchEvent(ev);373 };374 375 @Override376 public boolean onTouchEvent(MotionEvent event) {377 // TODO Auto-generated method stub378 try {379 mDragHelper.processTouchEvent(event);380 } catch (Exception e) {381 e.printStackTrace();382 }383 // 返回true,持续接收事件384 return true;385 }386 387 /**388 * 当View中所有的子控件 均被映射成389 */390 @Override391 protected void onFinishInflate() {392 // TODO Auto-generated method stub393 super.onFinishInflate();394 if (getChildCount() < 2) {395 throw new IllegalAccessError(396 "布局至少有2个孩子. Your ViewGroup must have 2 children at least");397 }398 if (!(getChildAt(0) instanceof ViewGroup && getChildAt(1) instanceof ViewGroup)) {399 throw new IllegalArgumentException(400 "子View必须是ViewGroup的子类. Your children must be an instance of ViewGroup");401 }402 mLeftContent = (ViewGroup) getChildAt(0);403 mMainContent = (ViewGroup) getChildAt(1);404 }405 406 /**407 * 当view的大小发生变化时触发408 */409 private int mRange;410 private int mHeight;411 private int mWidth;412 413 @Override414 protected void onSizeChanged(int w, int h, int oldw, int oldh) {415 // 当尺寸有变化的时候调用416 super.onSizeChanged(w, h, oldw, oldh);417 mHeight = getMeasuredHeight();418 mWidth = getMeasuredWidth();419 mRange = (int) (mWidth * 0.6f);420 }421 422 }
如下是主程序代码
1 package com.demo.sb.main; 2 3 import com.demo.sb.mainfram.TentcentOneFragment; 4 import com.demo.sb.mainfram.TentcentThreeFragment; 5 import com.demo.sb.mainfram.TentcentTwoFragment; 6 import com.demo.sb.utils.Utils; 7 import com.demo.sb.widget.DragLayout; 8 import com.demo.sb.widget.DragLayout.OnDragStatusChangeListener; 9 import com.demo.sb.widget.MyListLinearLayout; 10 import com.demo.suibian.R; 11 import com.nineoldandroids.animation.ObjectAnimator; 12 import com.nineoldandroids.view.ViewHelper; 13 14 import android.os.Bundle; 15 import android.support.v4.app.FragmentActivity; 16 import android.support.v4.app.FragmentManager; 17 import android.support.v4.app.FragmentTransaction; 18 import android.view.View; 19 import android.view.Window; 20 import android.view.animation.CycleInterpolator; 21 import android.widget.ImageView; 22 import android.widget.RadioGroup; 23 import android.widget.RadioGroup.OnCheckedChangeListener; 24 import android.widget.TextView; 25 26 /** 27 * 侧滑菜单 28 * 29 * @author Administrator 30 * 31 */ 32 public class Activity_Tencent extends FragmentActivity { 33 34 private RadioGroup rg_tencent_mian; 35 // private FrameLayout fl_tencent_content; 36 private ImageView iv_header; 37 private TextView tv_header; 38 39 private TentcentOneFragment oneFragment; 40 private TentcentTwoFragment twoFragment; 41 private TentcentThreeFragment threeFragment; 42 private static DragLayout mDragLayout; 43 44 @Override 45 protected void onCreate(Bundle savedInstanceState) { 46 // TODO Auto-generated method stub 47 super.onCreate(savedInstanceState); 48 requestWindowFeature(Window.FEATURE_NO_TITLE); 49 setContentView(R.layout.activity_tencent); 50 51 initView(); 52 initData(); 53 54 } 55 56 private void initView() { 57 // TODO Auto-generated method stub 58 rg_tencent_mian = (RadioGroup) findViewById(R.id.rg_tencent_mian); 59 iv_header = (ImageView) findViewById(R.id.iv_header); 60 tv_header = (TextView) findViewById(R.id.tv_header); 61 MyListLinearLayout mLayout = (MyListLinearLayout) findViewById(R.id.mll); 62 mDragLayout = (DragLayout) findViewById(R.id.dl); 63 // 设置引用 64 mLayout.setDraglayout(mDragLayout); 65 66 mDragLayout.setDragStatusListener(new OnDragStatusChangeListener() { 67 68 @Override 69 public void onOpen() { 70 // TODO Auto-generated method stub 71 Utils.showToast(Activity_Tencent.this, "onOpen"); 72 } 73 74 @Override 75 public void onDraging(float percent) { 76 // TODO Auto-generated method stub 77 // 跟新图标的透明度 78 // 1.0 -> 0.0 79 ViewHelper.setAlpha(iv_header, 1 - percent); 80 } 81 82 @Override 83 public void onClose() { 84 // TODO Auto-generated method stub 85 Utils.showToast(Activity_Tencent.this, "onClose"); 86 // 让图片开会晃动 87 ObjectAnimator mAnim = ObjectAnimator.ofFloat(iv_header, 88 "translationX", 15.0f); 89 mAnim.setInterpolator(new CycleInterpolator(4)); 90 mAnim.setDuration(500); 91 mAnim.start(); 92 } 93 }); 94 95 iv_header.setOnClickListener(new View.OnClickListener() { 96 97 @Override 98 public void onClick(View arg0) { 99 // TODO Auto-generated method stub100 mDragLayout.open(true);101 }102 });103 }104 105 private void initData() {106 // TODO Auto-generated method stub107 rg_tencent_mian.check(R.id.rb_tencent_one);108 109 oneFragment = new TentcentOneFragment();110 twoFragment = new TentcentTwoFragment();111 threeFragment = new TentcentThreeFragment();112 // 获取fragment管理器113 FragmentManager fragmentManager = getSupportFragmentManager();114 // 打开事务115 FragmentTransaction transaction = fragmentManager.beginTransaction();116 // 把内容显示到帧布局中117 transaction.add(R.id.fl_tencent_content, oneFragment);118 transaction.add(R.id.fl_tencent_content, twoFragment);119 transaction.add(R.id.fl_tencent_content, threeFragment);120 transaction.show(oneFragment).hide(twoFragment).hide(threeFragment);121 // 提交122 transaction.commit();123 tv_header.setText("head");124 125 rg_tencent_mian126 .setOnCheckedChangeListener(new OnCheckedChangeListener() {127 128 @Override129 public void onCheckedChanged(RadioGroup arg0, int arg1) {130 // TODO Auto-generated method stub131 switch (arg1) {132 case R.id.rb_tencent_one:133 tv_header.setText("head");134 getSupportFragmentManager().beginTransaction()135 .show(oneFragment).hide(twoFragment)136 .hide(threeFragment).commit();137 break;138 case R.id.rb_tencent_two:139 tv_header.setText("联系人");140 getSupportFragmentManager().beginTransaction()141 .show(twoFragment).hide(oneFragment)142 .hide(threeFragment).commit();143 break;144 case R.id.rb_tencent_three:145 tv_header.setText("动态");146 getSupportFragmentManager().beginTransaction()147 .show(threeFragment).hide(oneFragment)148 .hide(twoFragment).commit();149 break;150 default:151 break;152 }153 }154 });155 }156 157 }
主程序的布局
<? android:id="@+id/dl" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#50ff" android:orientation="vertical" android:paddingBottom="50dp" android:paddingLeft="10dp" android:paddingRight="50dp" android:paddingTop="50dp" > <ImageView android:layout_width="50dp" android:layout_height="50dp" android:contentDescription="@null" android:src='/images/loading.gif' data-original="@drawable/head" /> </LinearLayout> <com.demo.sb.widget.MyListLinearLayout android:id="@+id/mll" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="#18B6EF" android:gravity="center_vertical" > <ImageView android:id="@+id/iv_header" android:layout_width="30dp" android:layout_height="30dp" android:layout_marginLeft="15dp" android:contentDescription="@null" android:src='/images/loading.gif' data-original="@drawable/head" /> <TextView android:id="@+id/tv_header" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:layout_centerHorizontal="true" android:textColor="#fff" android:textSize="18sp" android:text="" /> </RelativeLayout> <FrameLayout android:id="@+id/fl_tencent_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <RadioGroup android:id="@+id/rg_tencent_mian" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_tab_bg" android:orientation="horizontal" > <RadioButton android:id="@+id/rb_tencent_one" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:button="@null" android:drawablePadding="3dp" android:drawableTop="@drawable/btn_tab_home_selector" android:gravity="center" android:text="消息" android:textColor="@drawable/btn_tab_text_selector" /> <RadioButton android:id="@+id/rb_tencent_two" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:button="@null" android:drawablePadding="3dp" android:drawableTop="@drawable/btn_tab_home_selector" android:gravity="center" android:text="联系人" android:textColor="@drawable/btn_tab_text_selector" /> <RadioButton android:id="@+id/rb_tencent_three" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:button="@null" android:drawablePadding="3dp" android:drawableTop="@drawable/btn_tab_home_selector" android:gravity="center" android:text="动态" android:textColor="@drawable/btn_tab_text_selector" /> </RadioGroup> </com.demo.sb.widget.MyListLinearLayout></com.demo.sb.widget.DragLayout>
View Code
主界面是用继承的FragmentActivity来实现下面3个按钮的点击事件,其中第一个Fragment(TentcentOneFragment)内只有个ListView
当停在侧滑界面时,ListView不能进行上下滑动
TentcentOneFragment的代码和
package com.demo.sb.mainfram;import com.demo.suibian.R;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;public class TentcentOneFragment extends Fragment { private ListView mListView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return inflater.inflate(R.layout.tentcentonefragment, null, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); mListView = (ListView) getActivity().findViewById(R.id.lv_one_listview); mListView.setAdapter(new MyListAdapter()); } private int[] con = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; private String[] name = { "第一人", "第二人", "第三人", "第四人", "第五人", "第六人", "第七人", "第八人", "第九人", "第十人", "第十一人", "第十二人", "第十三人" }; private class MyListAdapter extends BaseAdapter { @Override public int getCount() { // TODO Auto-generated method stub return name.length; } @Override public String getItem(int arg0) { // TODO Auto-generated method stub return name[arg0]; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(int arg0, View arg1, ViewGroup arg2) { // TODO Auto-generated method stub ViewHolder holder; if (arg1 == null) { arg1 = View.inflate(getActivity(), R.layout.item_onelist, null); holder = new ViewHolder(); holder.tv_name = (TextView) arg1.findViewById(R.id.item_name); holder.tv_fight = (TextView) arg1.findViewById(R.id.item_fight); arg1.setTag(holder); } else { holder = (ViewHolder) arg1.getTag(); } holder.tv_name.setText("名字:" + getItem(arg0)); holder.tv_fight.setText("战斗力:" + con[arg0]); return arg1; } } static class ViewHolder { TextView tv_name; TextView tv_fight; }}
View Code
<? android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" android:orientation="vertical" > <ListView android:id="@+id/lv_one_listview" android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>
View Code
第二个Fragment(TentcentTwoFragment)内只有个ViewPager可以进行左右滑动不过还是有点问题
package com.demo.sb.mainfram;import java.util.ArrayList;import com.demo.suibian.R;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;public class TentcentTwoFragment extends Fragment { private LinearLayout ll_two_group;// 引导圆点的父控件 private ViewPager mViewPager; private ImageView[] diandian;//ViewPager上的点点 private static final int[] mImageIds = new int[] { R.drawable.c, R.drawable.a, R.drawable.d }; private ArrayList<ImageView> mImageViewList; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return inflater.inflate(R.layout.tentcenttwofragment, null, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); initView(); } private void initView() { // TODO Auto-generated method stub mViewPager = (ViewPager) getActivity().findViewById( R.id.vp_tentwo_viewpager); ll_two_group = (LinearLayout) getActivity().findViewById( R.id.ll_two_group); initViewPager(); mViewPager.setAdapter(new GuideAdapter()); mViewPager.setCurrentItem(0); mViewPager.setOnPageChangeListener(new GuidePagerListener()); } private void initViewPager() { // TODO Auto-generated method stub // 初始化引导的3个界面 mImageViewList = new ArrayList<ImageView>(); for (int i = 0; i < mImageIds.length; i++) { ImageView imageView = new ImageView(getActivity()); imageView.setBackgroundResource(mImageIds[i]); mImageViewList.add(imageView); } diandian = new ImageView[mImageIds.length]; for (int i = 0; i < mImageIds.length; i++) { //循环加入点点图片组 diandian[i] = new ImageView(getActivity()); if( i== 0){ diandian[i].setImageResource(R.drawable.point_selecte); }else { diandian[i].setImageResource(R.drawable.point_normal); } diandian[i].setPadding(8, 8, 8, 8); ll_two_group.addView(diandian[i]); }// // 初始化引导页的小圆点// for (int i = 0; i < mImageIds.length; i++) {// View point = new View(getActivity());// point.setBackgroundResource(R.drawable.point_normal);// LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(// 10, 10);// if (i > 0) {// params.leftMargin = 10;// 设置圆点的间隔// }// point.setLayoutParams(params);// 设置圆点的大小// ll_two_group.addView(point);// }// } class GuideAdapter extends PagerAdapter { @Override public int getCount() { // TODO Auto-generated method stub return mImageIds.length; //return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == arg1; } @Override public Object instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub container.addView(mImageViewList.get(position)); return mImageViewList.get(position);// container.addView(mImageViewList.get(position%mImageViewList.size()));// return mImageViewList.get(position%mImageViewList.size()); } @Override public void destroyItem(ViewGroup container, int position, Object object) { // TODO Auto-generated method stub container.removeView((View) object); //container.removeView(mImageViewList.get(position%mImageViewList.size())); } } /** * ViewPager 的滑动监听 * * @author Administrator * */ class GuidePagerListener implements OnPageChangeListener { // 操作屏幕时发生变化 @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } // 屏幕滚动过程中不断被调用 @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub// int len = (int) (mPointWidth * arg1) + arg0 * mPointWidth;// System.out.println(len);// // 获取当前红色点的布局参数// RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view_two_point// .getLayoutParams();// params.leftMargin = len;// 设置左边距// view_two_point.setLayoutParams(params);// 重新给小红点设置布局参数 } // 哪个页面被选中 position就是当前滑动到的页面 @Override public void onPageSelected(int position) { // TODO Auto-generated method stub System.out.println("第几个页面" + position +" "+ position%mImageViewList.size()); for (int i = 0; i < mImageIds.length; i++) { diandian[position].setImageResource(R.drawable.point_selecte); if(i != position){ diandian[i].setImageResource(R.drawable.point_normal); } } } }}
View Code
1 <? 2 <LinearLayout 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:background="#0f0" 6 android:orientation="vertical" > 7 8 <TextView 9 android:layout_width="wrap_content"10 android:layout_height="wrap_content"11 android:text="@string/app_name" />12 13 <RelativeLayout14 android:layout_width="match_parent"15 android:layout_height="200dp" >16 17 <com.demo.sb.widget.MyViewPager18 android:id="@+id/vp_tentwo_viewpager"19 android:layout_width="match_parent"20 android:layout_height="match_parent" />21 22 <RelativeLayout23 android:layout_width="wrap_content"24 android:layout_height="wrap_content"25 android:layout_alignParentBottom="true"26 android:layout_centerHorizontal="true"27 android:layout_marginBottom="25dp" >28 29 <LinearLayout30 android:id="@+id/ll_two_group"31 android:layout_width="wrap_content"32 android:layout_height="wrap_content"33 android:orientation="horizontal" /> 34 </RelativeLayout>35 </RelativeLayout>36 37 <TextView38 android:layout_width="match_parent"39 android:layout_height="wrap_content"40 android:text="@string/app_name" />41 42 </LinearLayout>
View Code
下面是2个工具类
第一个是自定义的线性布局可以当侧滑界面打开时,让ListView不能进行滑动
1 package com.demo.sb.widget; 2 3 import com.demo.sb.widget.DragLayout.Status; 4 5 import android.content.Context; 6 import android.util.AttributeSet; 7 import android.view.MotionEvent; 8 import android.widget.LinearLayout; 9 10 public class MyListLinearLayout extends LinearLayout {11 12 private DragLayout mDragLayout;13 public MyListLinearLayout(Context context) {14 super(context);15 // TODO Auto-generated constructor stub16 }17 18 public MyListLinearLayout(Context context, AttributeSet attrs) {19 super(context, attrs);20 // TODO Auto-generated constructor stub21 }22 23 // public MyListLinearLayout(Context context, AttributeSet attrs, int defStyle) {24 // super(context, attrs, defStyle);25 // // TODO Auto-generated constructor stub26 // }27 28 public void setDraglayout(DragLayout mDragLayout){29 this.mDragLayout = mDragLayout;30 }31 32 @Override33 public boolean onInterceptTouchEvent(MotionEvent ev) {34 // TODO Auto-generated method stub35 if(mDragLayout.getStatus() == Status.Close){36 return super.onInterceptTouchEvent(ev);37 38 }else {39 return true;40 }41 }42 43 @Override44 public boolean onTouchEvent(MotionEvent event) {45 // TODO Auto-generated method stub46 if(mDragLayout.getStatus() == Status.Close){47 return super.onTouchEvent(event);48 49 }else {50 if(event.getAction() == MotionEvent.ACTION_UP){51 mDragLayout.chose();;52 }53 return true;54 }55 }56 }
View Code
第二个是dp和px 的转化还有自定义Toast的设置比较常用
1 package com.demo.sb.utils; 2 3 import android.content.Context; 4 import android.widget.Toast; 5 6 public class DensityUtil { 7 8 /** 9 * 根据手机的分辨率从dip的单位转为px(像素)10 */11 public static int dip2px(Context context, float dp) {12 float density = context.getResources().getDisplayMetrics().density;13 int px = (int) (dp * density + 0.5f);// 4.9->5 4.4->414 return px;15 }16 /**17 * 根据手机的分辨率从px(像素)的单位转化成dip18 * @param ctx19 * @param px20 * @return21 */22 public static float px2dip(Context ctx, int px) {23 float density = ctx.getResources().getDisplayMetrics().density;24 float dp = px / (density + 0.5f);25 26 return dp;27 }28 29 /**30 * 自定义吐司31 * 32 */33 public static Toast mToast;34 public static void showToast(Context mContext, String msg) {35 if (mToast == null) {36 mToast = Toast.makeText(mContext, "", Toast.LENGTH_SHORT);37 }38 mToast.setText(msg);39 mToast.show();40 }41 }
原标题:侧滑2
关键词: