多个按钮左右相互挤压效果

多个按钮左右相互挤压效果

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

 2     xmlns:tools="http://schemas.android.com/tools"

 3     android:layout_width="match_parent"

 4     android:layout_height="match_parent"

 5     android:orientation="horizontal" >

 6     <LinearLayout 

 7         android:id="@+id/main_contain"

 8         android:layout_marginTop="50dp"

 9         android:layout_width="match_parent"

10         android:layout_height="50dp"

11         android:orientation="horizontal"

12         android:layout_centerInParent="true" >

13         <Button

14             android:id="@+id/btnOne"

15             android:layout_width="wrap_content"

16             android:layout_height="match_parent"

17             android:text="one" />

18         <Button

19             android:id="@+id/btnTwo"

20             android:layout_width="wrap_content"

21             android:layout_height="match_parent"

22             android:text="two" />

23         <Button

24             android:id="@+id/btnThree"

25             android:layout_width="wrap_content"

26             android:layout_height="match_parent"

27             android:text="three" />

28         <Button

29             android:id="@+id/btnFour"

30             android:layout_width="wrap_content"

31             android:layout_height="match_parent"

32             android:text="four" />

33     </LinearLayout>

34 </RelativeLayout>

 

  1 package com.example.xinxindemo;  2  3 import android.app.Activity;  4 import android.os.Bundle;  5 import android.os.Handler;  6 import android.os.Message;  7 import android.util.DisplayMetrics;  8 import android.util.Log;  9 import android.view.View;  10 import android.view.ViewGroup.LayoutParams;  11 import android.widget.Button;  12 import android.widget.LinearLayout;  13  14 public class PinchActivity extends Activity implements View.OnClickListener {  15  16 private final static String TAG = "PinchActivity";  18 // 屏幕宽度  19 private int screentWidth = 0;  21 // View可伸展最长的宽度  22 private int maxWidth;  24 // View可伸展最小宽度  25 private int minWidth;  27 // 当前点击的View  28 private View currentView;  30 // 显示最长的那个View  31 private View preView;  33 // 主布局ViewGroup  34 private LinearLayout mainContain;  36 // 标识符 动画是否结束  37 private boolean animationIsEnd = true;  39 // 变大操作  40 private static final int OPE_BIG = 1;  42 // 变小操作  43 private static final int OPE_SMALL = 2;  45 // 当前操作 -1表示无效操作  46 private int currentOpe = -1;  48 // 前进的步伐距离  49 private static final int STEP = 10;  50  51  @Override  52 protected void onCreate(Bundle savedInstanceState) {  53 super.onCreate(savedInstanceState);  55  setContentView(R.layout.activity_main);  56  57  initCommonData();  58  initViewData();  59  measureWidth(screentWidth);  60  }  61  62 private void initViewData() {  63 mainContain = (LinearLayout) this.findViewById(R.id.main_contain);  64  View child;  65 int childCount = mainContain.getChildCount();  66 for (int i = 0; i < childCount; i++) {  67 child = mainContain.getChildAt(i);  68 child.setOnClickListener(this);  69  }  70  }  71  72 private void initCommonData() {  73 DisplayMetrics metric = new DisplayMetrics();  74  getWindowManager().getDefaultDisplay().getMetrics(metric);  75 // 屏幕宽度(像素)  76 screentWidth = metric.widthPixels;  77  }  78  79 private void setCurrentViewParams() {  80 if (currentView == null) {  81 return;  82  }  83 LayoutParams params = currentView.getLayoutParams();  84 if (params == null) {  85 return;  86  }  87 int realWidth = params.width;  88 int nextWidth = 0;  89 if (currentOpe == OPE_BIG) {  90 nextWidth = realWidth + STEP;  91 } else if (currentOpe == OPE_SMALL) {  92 nextWidth = realWidth - STEP;  93  }  94 if (nextWidth > maxWidth) {  95 nextWidth = maxWidth;  96 } else if (nextWidth < minWidth) {  97 nextWidth = minWidth;  98  }  99 params.width = nextWidth; 100  currentView.setLayoutParams(params); 101 if (nextWidth == maxWidth || nextWidth == minWidth) { 102 animationIsEnd = true; 103  onOffClickable(); 104  stopAnimation(); 105 return; 106  } 107 mHandler.sendEmptyMessageDelayed(1, 20); 108  } 109 110 // 初始化宽度 测量max min 长度 111 private void measureWidth(int screenWidth) { 112 int halfWidth = screenWidth / 2; 113 maxWidth = halfWidth - 50; 114 minWidth = (screenWidth - maxWidth) / (mainContain.getChildCount() - 1); 115 116  View child; 117 int childCount = mainContain.getChildCount(); 118 for (int i = 0; i < childCount; i++) { 119 child = mainContain.getChildAt(i); 120 LayoutParams params = child.getLayoutParams(); 121 if (i == 0) { 122 preView = child; 123 params.width = maxWidth; 124 } else { 125 params.width = minWidth; 126  } 127  child.setLayoutParams(params); 128  } 129  } 130 131 // 这里用handler更新界面 132 private Handler mHandler = new Handler() { 133  @Override 134 public void handleMessage(Message msg) { 135 if (msg.what == 1) { 136  setCurrentViewParams(); 137  } 138  } 139  }; 140 141 // 停止动画 142 private void stopAnimation() { 143 currentOpe = -1; 144 currentView = null; 145  } 146 147 private void startAnimation() { 148 if (currentView == null || currentOpe == -1) { 149 Log.d(TAG, "无效动画"); 150 return; 151  } 152 animationIsEnd = false; 153  onOffClickable(); 154 mHandler.sendEmptyMessage(1); 155  } 156 157  @Override 158 public void onClick(View v) { 159 int id = v.getId(); 160 switch (id) { 161 case R.id.btnOne: 162 currentView = mainContain.getChildAt(0); 163 break; 164 case R.id.btnTwo: 165 currentView = mainContain.getChildAt(1); 166 break; 167 case R.id.btnThree: 168 currentView = mainContain.getChildAt(2); 169 break; 170 case R.id.btnFour: 171 currentView = mainContain.getChildAt(3); 172 break; 173  } 174 175 Log.i(TAG, ((Button) currentView).getText().toString() + " click"); 176 177 if (currentView != null && animationIsEnd) { 178 int currentViewWidth = currentView.getWidth(); 179 if (currentViewWidth == maxWidth) { 180 currentOpe = OPE_SMALL; 181 } else { 182 currentOpe = OPE_BIG; 183  } 184  clickEvent(currentView); 185  startAnimation(); 186  } 187 188  } 189 190 private void clickEvent(View view) { 191  View child; 192 int childCount = mainContain.getChildCount(); 193 for (int i = 0; i < childCount; i++) { 194 child = mainContain.getChildAt(i); 195 if (preView == child) { 196 LinearLayout.LayoutParams params = (android.widget.LinearLayout.LayoutParams) child 197  .getLayoutParams(); 198 params.weight = 1.0f; 199  child.setLayoutParams(params); 200 } else { 201 LinearLayout.LayoutParams params = (android.widget.LinearLayout.LayoutParams) child 202  .getLayoutParams(); 203 params.weight = 0.0f; 204 params.width = minWidth; 205  child.setLayoutParams(params); 206  } 207  } 208 preView = view; 209  printWeight(); 210  } 211 212 private void printWeight() { 213  View child; 214 int childCount = mainContain.getChildCount(); 215 for (int i = 0; i < childCount; i++) { 216 child = mainContain.getChildAt(i); 217 LinearLayout.LayoutParams params = (android.widget.LinearLayout.LayoutParams) child 218  .getLayoutParams(); 219 Log.i("mm1", ((Button) child).getText() + ": " + params.weight); 220  } 221  } 222 223 // 224 private void onOffClickable() { 225  View child; 226 boolean clickable = animationIsEnd; 227 int childCount = mainContain.getChildCount(); 228 for (int i = 0; i < childCount; i++) { 229 child = mainContain.getChildAt(i); 230  child.setClickable(clickable); 231  } 232  } 233 234 }

 

你可能感兴趣的:(效果)