ScrollView中嵌套ListView

 TextView顯示一行html

TextView及直接父類控件屬性layout_heightjava

android:layout_height="wrap_content/match_parent"//內容只顯示一行/內容徹底展現

SwipeRefreshLayout佈局中添加 CircleView佈局android

android.support.v4.widget.SwipeRefreshLayout.java
{
    public SwipeRefreshLayout(Context context, AttributeSet attrs) {
        //構造方法中調用createProgressView函數
        createProgressView();
    }

    private void createProgressView() {
        mCircleView = new CircleImageView(getContext(), CIRCLE_BG_LIGHT, CIRCLE_DIAMETER/2);
        mProgress = new MaterialProgressDrawable(getContext(), this);
        mProgress.setBackgroundColor(CIRCLE_BG_LIGHT);
        mCircleView.setImageDrawable(mProgress);
        //添加布局時是隱藏狀態
        mCircleView.setVisibility(View.GONE);
        //把子視圖添加到該佈局中
        addView(mCircleView);
    }

}

顯示CircleView佈局app

有兩處顯示CircleView佈局ide

android.support.v4.widget.SwipeRefreshLayout.java
{
    /**
     *該函數是一個Public函數
     *該函數是給外部提供的
     *惟一一個調用startScaleUpAnimation函數的函數
     */
    public void setRefreshing(boolean refreshing) {
        
    }

    /**
     *該函數是一個私有函數,說明有能被該類中的函數調用
     *該函數顯示CircleView佈局
     */
    private void startScaleUpAnimation(AnimationListener listener) {
        //<1>顯示CircleView佈局
        mCircleView.setVisibility(View.VISIBLE);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        final int action = MotionEventCompat.getActionMasked(ev);
        switch (action) {
            //ACTION_MOVE在下滑的過程當中纔會顯示CircleView佈局
            case MotionEvent.ACTION_MOVE: {
                //布爾變量mIsBeingDragged爲true纔會顯示CircleView佈局
                if (mIsBeingDragged) {
                    // where 1.0f is a full circle
                    //<2>顯示CircleView視圖
                    if (mCircleView.getVisibility() != View.VISIBLE) {
                        mCircleView.setVisibility(View.VISIBLE);
                    }
                break;
            }
    }



}

mIsBeingDragged布爾變量函數

android.support.v4.widget.SwipeRefreshLayout.java
{
    //開始往下拽的標識,默認值爲false.
    private boolean mIsBeingDragged;

    //手指按下去的點的y座標
    private float mInitialDownY;

    private int mTouchSlop;
    public SwipeRefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        //ViewConfiguration.getScaledTouchSlop();觸發移動事件的最小距離
        //自定義View處理touch事件的時候,有的時候須要判斷用戶是否真的存在movie
        //系統提供了這樣的方法。表示滑動的時候,手的移動要大於這個返回的距離值纔開始移動控件。
        //int TOUCH_SLOP = 8;
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (action) {
            case MotionEvent.ACTION_DOWN: {
                mIsBeingDragged = false;
                //按下時點的y座標
                final float initialDownY = getMotionEventY(ev, mActivePointerId);
                mInitialDownY = initialDownY;
            }
                break;
            case MotionEvent.ACTION_MOVE:{
                //移動過程當中點的y座標
                final float y = getMotionEventY(ev, mActivePointerId);
                final float yDiff = y - mInitialDownY;
                if (yDiff > mTouchSlop && !mIsBeingDragged) {
                    //下拉到必定的距離,而且尚未顯示
                    mIsBeingDragged = true;
                }
                break;
            }


}

CircleView佈局隨着滑動位置發生變化佈局

佈局函數onLayout()this

(width / 2 - circleWidth / 2)spa

mCurrentTargetOffsetTopcode

width / 2 + circleWidth / 2

mCurrentTargetOffsetTop + circleHeight

這裏惟一發生變化的是變量mCurrentTargetOffsetTop

android.support.v4.widget.SwipeRefreshLayout.java
{
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        int circleWidth = mCircleView.getMeasuredWidth();
        int circleHeight = mCircleView.getMeasuredHeight();
        mCircleView.layout((width / 2 - circleWidth / 2), mCurrentTargetOffsetTop,
                (width / 2 + circleWidth / 2), mCurrentTargetOffsetTop + circleHeight);
    }
}

測量函數

android.support.v4.widget.SwipeRefreshLayout.java
{
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        mCircleView.measure(MeasureSpec.makeMeasureSpec(mCircleWidth, MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(mCircleHeight, MeasureSpec.EXACTLY));
        if (!mUsingCustomStart && !mOriginalOffsetCalculated) {
            mOriginalOffsetCalculated = true;
            mCurrentTargetOffsetTop = mOriginalOffsetTop = -mCircleView.getMeasuredHeight();
        }
    }
}

CircleView佈局以縮減的方式消失

PullRefreshLayout.java {
    private void startScaleDownAnimation(Animation.AnimationListener listener) {
        mScaleDownAnimation = new Animation() {
            @Override
            public void applyTransformation(float interpolatedTime, Transformation t) {
                setAnimationProgress(1 - interpolatedTime);
            }
        };
        mScaleDownAnimation.setDuration(SCALE_DOWN_DURATION);
        mCircleView.setAnimationListener(listener);
        mCircleView.clearAnimation();
        mCircleView.startAnimation(mScaleDownAnimation);
    }
}

箭頭隨着下拉的距離透明度的改變

SwipeRefreshLayout.java
{
    private static final int STARTING_PROGRESS_ALPHA = (int) (.3f * MAX_ALPHA);

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        final int action = MotionEventCompat.getActionMasked(ev);
        switch (action) {
            case MotionEvent.ACTION_MOVE: {
                    mProgress.showArrow(true);

            }

        }
        
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final int action = MotionEventCompat.getActionMasked(ev);

        switch (action) {
            case MotionEvent.ACTION_MOVE:
                mProgress.setAlpha(STARTING_PROGRESS_ALPHA);
                break;
        }
    }
}

 

ListView

RecyclerView

Bitmap

public final class Bitmap implements Parcelable {

}

Bitmap與Matrix

高效顯示Bitmap

https://developer.android.com/topic/performance/graphics/index.html

相關文章
相關標籤/搜索