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