码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-04 19:47:20      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

 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 }

 

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

标签:

原文地址:http://www.cnblogs.com/androidsj/p/4476833.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!