zoukankan      html  css  js  c++  java
  • 多个按钮左右相互挤压效果

     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 }
  • 相关阅读:
    php socket 发送HTTP请求 POST json
    登录令牌 Token 介绍
    如何打开rdb文件
    Web登录其实没那么简单
    爆款小程序是如何诞生的?
    如何在小程序上增加音视频?
    拒绝“割韭菜”— 谈谈区块链正经的商用场景!
    想知道微信怎么做指纹支付开发?看这里!
    游戏安全有多重要?——GAME-TECH游戏开发者技术沙龙
    嘿,OCR文字识别了解下!
  • 原文地址:https://www.cnblogs.com/androidsj/p/4476833.html
Copyright © 2011-2022 走看看