android小結

水的川發表於2016-08-16

記錄新的知識點:
1:為什麼mContentFmLayout明明是FrameLayout 型別,在mContentFmLayout.getLayoutParams()得到的是LinearLayout,
看下原始碼後發現,通過getLayoutParams()獲取到的是父類的型別哦。

private FrameLayout mContentFmLayout;
LinearLayout.LayoutParams lpC = (LinearLayout.LayoutParams) mContentFmLayout.getLayoutParams();

2:設定頭部下拉重新整理成功後,頭部隱藏的動畫。

mHiddenAction = new SelfTranslateAnimation(0,0,0,-getResources().getDimensionPixelOffset(R.dimen.cheader_height));
 mRootView.startAnimation(mHiddenAction);//執行動畫
 class SelfTranslateAnimation extends TranslateAnimation{

        public SelfTranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {
            super(fromXDelta, toXDelta, fromYDelta, toYDelta);
        }
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {//這方法是關鍵哦,interpolatedTime是0到1的漸變。通過設定setDuration,控制漸變速度。
            LinearLayout.LayoutParams llp = (LinearLayout.LayoutParams) mUpdateHeaderView.getLayoutParams();
            llp.setMargins(0,-(int)(getResources().getDimensionPixelOffset(R.dimen.cheader_height)*interpolatedTime),0,0);//巧妙的通過設定負的margin來實現隱藏效果。
            mUpdateHeaderView.setLayoutParams(llp);
        }
    }

3.android事件分發注意事項:
1.首先事件先下發到父類如(ViewGroup),通過dispatchTouchEvent,若為true則阻止事件進一步下發,判斷條件有兩個onInterceptTouchEvent和disallowIntercept,兩者的取值預設都為false,當disallowIntercept的值為true時事件就開始下發,或者當onInterceptTouchEvent為false時事件開始下發,disallowIntercept的另一個作用就是阻止將子控制元件的事件繼續傳到父類的ontouchevent中處理,當設定為true時就阻止了向父類繼續傳遞。disallowIntercept的值可以通過呼叫requestDisallowInterceptTouchEvent方法對這個值進行修改,多用於滑動衝突解決如(豎直方向巢狀橫向的scrollview的組合)。
2.在ontouchevent事件中若想事件向ACTION_MOVE傳遞,不能在down事件中就返回false,要返回true繼續傳遞。

相關文章