• Android特效開發

    0
    Android Java C/C++ Go list 19232 次瀏覽
    Android特效開發

    本次我要向大家介紹一個Android特效,這個特效也是我在某款軟件中看到的,至于軟件叫什么,
    好了,我來上一張動態效果圖 在下面,屏幕小的請往下拉。

    我不知道原軟件是怎么個實現法,在這里我只是說說我的實現方法,代碼可能不太好,這只是本人的一個idea 原理很簡單!


    改變按鈕的寬度,每次當你點擊按鈕時,只有兩個按鈕改變寬度,一個變長,一個變短,只是這個變化是慢慢

    進行,不是秒變的,你懂的,這就是動畫效果。你點擊短的按鈕后會漸漸地變長,長的按鈕會隨著被壓縮,其他按鈕寬度不變。

     我寫這篇文章想起到一個拋磚引玉的效果,希望讀者看了這篇文章后繼續寫個更好的文章。當然你不要忘記我啊,

    記得要與我和大家分享啊。

     下面是特效Demo運行后的效果圖:


    可以看到view被擠壓的效果,點擊短的view會慢慢長大。在短的view慢慢長大的同時,最長的view會慢慢縮小,而且每次動畫結束后都

    有一個最長的view 。我這里所說的view在本次Demo中是按鈕,當然你也可以換成其他的控件,或者是ViewGroup的子類也行。
    [java] view plaincopyprint?

        public class PinchActivity extends Activity implements View.OnClickListener {  
          
            private final static String TAG = "MainActivity";  
              
            // 屏幕寬度  
            private int screentWidth = 0;  
              
            // View可伸展最長的寬度  
            private int maxWidth;  
              
            // View可伸展最小寬度  
            private int minWidth;  
              
            // 當前點擊的View  
            private View currentView;  
              
            // 顯示最長的那個View  
            private View preView;  
              
            // 主布局ViewGroup  
            private LinearLayout mainContain;  
              
            // 標識符 動畫是否結束  
            private boolean animationIsEnd = true;  
              
            // 變大操作  
            private static final int OPE_BIG = 1;  
              
            // 變小操作  
            private static final int OPE_SMALL = 2;  
              
            // 當前操作 -1表示無效操作  
            private int currentOpe = -1;  
              
            // 前進的步伐距離  
            private static final int STEP = 10;  
          
            @Override  
            protected void onCreate(Bundle savedInstanceState)   
            {  
          
                super.onCreate(savedInstanceState);  
                  
                setContentView(R.layout.activity_main);  
          
                initCommonData();  
                  
                initViewData();  
                  
                measureWidth(screentWidth);   
          
            }  
          
            private void initViewData() {  
          
                mainContain = (LinearLayout) this.findViewById(R.id.main_contain);  
                View child;  
                int childCount = mainContain.getChildCount();  
                for (int i = 0; i < childCount; i++) {  
                    child = mainContain.getChildAt(i);  
                    child.setOnClickListener(this);  
                }  
            }  
              
            private void initCommonData()  
            {  
                DisplayMetrics metric = new DisplayMetrics();  
                getWindowManager().getDefaultDisplay().getMetrics(metric);  
                screentWidth = metric.widthPixels; // 屏幕寬度(像素)  
            }  
          
          
            private void setCurrentViewParams() {  
          
                if (currentView == null) {  
                    return;  
                }  
                LayoutParams params = currentView.getLayoutParams();  
                if (params == null) {  
                    return;  
                }  
                int realWidth = params.width;  
                int nextWidth = 0;  
                if (currentOpe == OPE_BIG) {  
                    nextWidth = realWidth + STEP;  
                } else if (currentOpe == OPE_SMALL) {  
                    nextWidth = realWidth - STEP;  
                }  
                if (nextWidth > maxWidth) {  
                    nextWidth = maxWidth;  
                } else if (nextWidth < minWidth) {  
                    nextWidth = minWidth;  
                }  
                params.width = nextWidth;  
                currentView.setLayoutParams(params);  
                if (nextWidth == maxWidth || nextWidth == minWidth) {  
                    animationIsEnd = true;  
                    onOffClickable();  
                    stopAnimation();  
                    return;  
                }  
                mHandler.sendEmptyMessageDelayed(1, 20);  
            }  
          
            // 初始化寬度 測量max min 長度  
            private void measureWidth(int screenWidth) {  
                  
                int halfWidth = screenWidth / 2;  
                maxWidth = halfWidth - 50;  
                minWidth = (screenWidth - maxWidth) / (mainContain.getChildCount() - 1);  
          
                View child;  
                int childCount = mainContain.getChildCount();  
                for (int i = 0; i < childCount; i++) {  
                    child = mainContain.getChildAt(i);  
                    LayoutParams params = child.getLayoutParams();  
                    if (i == 0) {  
                        preView = child;  
                        params.width = maxWidth;  
                    } else {  
                        params.width = minWidth;  
                    }  
          
                    child.setLayoutParams(params);  
                }  
            }  
          
            // 這里用handler更新界面  
            private Handler mHandler = new Handler() {  
          
                @Override  
                public void handleMessage(Message msg) {  
          
                    if (msg.what == 1) {  
                        setCurrentViewParams();  
                    }   
                }  
          
            };  
          
            // 停止動畫  
            private void stopAnimation() {  
                currentOpe = -1;  
                currentView = null;  
            }  
          
            private void startAnimation() {  
          
                if (currentView == null || currentOpe == -1) {  
                    Log.d(TAG, "無效動畫");  
                    return;  
                }  
                  
                animationIsEnd = false;  
                onOffClickable();  
                mHandler.sendEmptyMessage(1);  
            }  
          
            @Override  
            public void onClick(View v) {  
                  
                int id = v.getId();  
                  
                switch (id) {  
                  
                case R.id.btnOne:  
                    currentView = mainContain.getChildAt(0);  
                    break;  
                case R.id.btnTwo:  
                    currentView = mainContain.getChildAt(1);  
                    break;  
                case R.id.btnThree:  
                    currentView = mainContain.getChildAt(2);  
                    break;  
                case R.id.btnFour:  
                    currentView = mainContain.getChildAt(3);  
                    break;  
                }  
          
                Log.i(TAG, ((Button) currentView).getText().toString() + " click");  
                  
                if (currentView != null && animationIsEnd) {  
                      
                    int currentViewWidth = currentView.getWidth();  
                      
                    if (currentViewWidth == maxWidth) {  
                        currentOpe = OPE_SMALL;  
                    } else {  
                        currentOpe = OPE_BIG;  
                    }  
                      
                    clickEvent(currentView);  
                      
                    startAnimation();  
                }  
          
            }  
          
            private void clickEvent(View view) {  
                View child;  
                int childCount = mainContain.getChildCount();  
                for (int i = 0; i < childCount; i++) {  
                    child = mainContain.getChildAt(i);  
                    if (preView == child) {  
                        LinearLayout.LayoutParams params = (android.widget.LinearLayout.LayoutParams) child  
                                .getLayoutParams();  
                        params.weight = 1.0f;  
                        child.setLayoutParams(params);  
                    } else {  
                        LinearLayout.LayoutParams params = (android.widget.LinearLayout.LayoutParams) child  
                                .getLayoutParams();  
                        params.weight = 0.0f;  
                        params.width = minWidth;  
                        child.setLayoutParams(params);  
                    }  
                }  
                preView = view;  
                printWeight();  
            }  
          
            private void printWeight() {  
                View child;  
                int childCount = mainContain.getChildCount();  
                for (int i = 0; i < childCount; i++) {  
                    child = mainContain.getChildAt(i);  
                    LinearLayout.LayoutParams params = (android.widget.LinearLayout.LayoutParams) child  
                            .getLayoutParams();  
                    Log.i("mm1", ((Button) child).getText() + ": " + params.weight);  
                }  
            }  
              
            //   
            private void onOffClickable()  
            {  
                View child;  
                boolean clickable = animationIsEnd;  
                int childCount = mainContain.getChildCount();  
                for (int i = 0; i < childCount; i++) {  
                    child = mainContain.getChildAt(i);  
                    child.setClickable(clickable);  
                }  
            }  
          
        }
    大家學了過后,有沒有幫助啊。學android特效上IT藍豹。

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色