您好,登錄后才能下訂單哦!
Android中怎么實(shí)現(xiàn)淘寶下拉刷新效果,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
步驟:
1、自定義一個(gè)view。(包含圓弧的繪制和箭頭的顯示和隱藏)
2、自定義頭部。
1)、創(chuàng)建attrs文件
<declare-styleable name="TaoBaoView"> <attr name="ringProgressColor" format="color" /> <attr name="ringWidth" format="dimension" /> <attr name="ringImage" format="reference" /> <attr name="ringmax" format="integer" /> </declare-styleable>
2、創(chuàng)建一個(gè)類 TaoBaoView.class
public class TaoBaoView extends View{ //圓環(huán)進(jìn)度顏色 private int ringProgressColor; //圓環(huán)的寬度 private float ringWidth; //最大值 private int ringMax; //中間的icon private Bitmap ringImage; //中間X坐標(biāo) private int centerX; //中間Y坐標(biāo) private int centerY; //畫筆 private Paint mPaint; //View寬度 private int width; //View高度 private int height; //進(jìn)度 private int progress; //半徑 private int radius; //是否顯示圖標(biāo) private boolean isShowIcon=true; public TaoBaoView(Context context) { this(context,null); } public TaoBaoView(Context context, AttributeSet attrs) { this(context, attrs,0); } public TaoBaoView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.TaoBaoView); ringProgressColor=typedArray.getColor(R.styleable.TaoBaoView_ringProgressColor, Color.GRAY); ringWidth=typedArray.getDimension(R.styleable.TaoBaoView_ringWidth, 5); ringMax=typedArray.getInteger(R.styleable.TaoBaoView_ringmax, 50); ringImage= BitmapFactory.decodeResource(getResources(), typedArray.getResourceId(R.styleable.TaoBaoView_ringImage,R.mipmap.jiantou)); init(); } private void init() { mPaint=new Paint(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthMode=MeasureSpec.getMode(widthMeasureSpec); int widthSize=MeasureSpec.getSize(widthMeasureSpec); int heightMode=MeasureSpec.getMode(heightMeasureSpec); int heightSize=MeasureSpec.getSize(heightMeasureSpec); if(widthMode==MeasureSpec.AT_MOST)width=dp2px(30); else width=widthSize; if(heightMode==MeasureSpec.AT_MOST)height=dp2px(30); else height=heightSize; setMeasuredDimension(width,height); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); //獲取中心點(diǎn)的位置 centerX=getWidth()/2; centerY=getHeight()/2; radius=(int) (centerX - ringWidth / 2); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); //確定View的寬高 width = w; height = h; } @Override public void draw(Canvas canvas) { super.draw(canvas); drawProgress(canvas); drawImage(canvas); } /** * 繪制圖片 * @param canvas */ private void drawImage(Canvas canvas) { if(isShowIcon) canvas.drawBitmap(ringImage,centerX-ringImage.getWidth()/2,centerY-ringImage.getHeight()/2,mPaint); } /** * 繪制進(jìn)度條 * @param canvas */ private void drawProgress(Canvas canvas) { mPaint.setAntiAlias(true); mPaint.setColor(ringProgressColor); mPaint.setStrokeWidth(ringWidth); //設(shè)置畫筆樣式 mPaint.setStyle(Paint.Style.STROKE); RectF rectF=new RectF(centerX-radius,centerY-radius,centerX+radius,centerY+radius); //繪制圓弧 canvas.drawArc(rectF,-110,-360*progress/ringMax,false,mPaint); } /** * dp轉(zhuǎn)px * @param dp * @return */ public int dp2px(int dp){ float density = getContext().getResources().getDisplayMetrics().density; return (int) (dp * density + 0.5f); } /** * 設(shè)置進(jìn)度 * @param progress */ public synchronized void setProgress(int progress){ if(progress<0){ progress=0; } if(progress>=ringMax){ progress=ringMax; } this.progress=progress; postInvalidate(); } /** * 設(shè)置是否顯示圖標(biāo) * @param isShow */ public synchronized void setIsShowIcon(boolean isShow){ this.isShowIcon=isShow; } }
3、創(chuàng)建一個(gè)headerLayout 下拉刷新頭部
public class HeaderLayout extends LoadingLayoutBase { private Context mContext; private RotateAnimation refreshingAnimation; private TextView ring_refresh_status; private TaoBaoView mTaoBaoView; private LinearLayout header_base; private LinearLayout header_layout; public HeaderLayout(Context context) { this(context, PullToRefreshBase.Mode.PULL_FROM_START); } public HeaderLayout(Context context, PullToRefreshBase.Mode mode) { super(context); init(context,mode); } private void init(Context mContext,PullToRefreshBase.Mode mode) { this.mContext=mContext; LayoutInflater.from(mContext).inflate(R.layout.taobao_view, this); header_base=(LinearLayout)findViewById(R.id.header_base); header_layout=(LinearLayout)findViewById(R.id.refresh_header_content); mTaoBaoView=(TaoBaoView)findViewById(R.id.taobao_view); ring_refresh_status=(TextView)findViewById(R.id.taobao_tv); refreshingAnimation = (RotateAnimation) AnimationUtils.loadAnimation(mContext, R.anim.rotating); LinearInterpolator lir = new LinearInterpolator(); refreshingAnimation.setInterpolator(lir); mTaoBaoView.setProgress(90); LayoutParams lp = (LayoutParams) header_base.getLayoutParams(); lp.gravity = mode == PullToRefreshBase.Mode.PULL_FROM_END ? Gravity.TOP : Gravity.BOTTOM; reset(); } @Override public int getContentSize() { return header_layout.getHeight(); } /** * 下拉可以刷新 */ @Override public void pullToRefresh() { ring_refresh_status.setText("下拉刷新"); mTaoBaoView.setIsShowIcon(true); } /** * 松開后刷新 */ @Override public void releaseToRefresh() { ring_refresh_status.setText("松開刷新"); mTaoBaoView.setIsShowIcon(false); } /** * 下拉中 * @param scaleOfLayout scaleOfLayout */ @Override public void onPull(float scaleOfLayout) { scaleOfLayout = scaleOfLayout > 1.0f ? 1.0f : scaleOfLayout; int progress=(int) ((scaleOfLayout)*100); mTaoBaoView.setProgress(progress>90?90:progress); } /** * 正在刷新 */ @Override public void refreshing() { mTaoBaoView.setIsShowIcon(false); ring_refresh_status.setText("正在刷新"); mTaoBaoView.startAnimation(refreshingAnimation); } @Override public void reset() { mTaoBaoView.clearAnimation(); } @Override public void setPullLabel(CharSequence pullLabel) { } @Override public void setRefreshingLabel(CharSequence refreshingLabel) { } @Override public void setReleaseLabel(CharSequence releaseLabel) { } }
4、在mainactivity中:
mPullToRefreshListView=(PullToRefreshListView)findViewById(R.id.list); mPullToRefreshListView.setHeaderLayout(new HeaderLayout(this));
看完上述內(nèi)容,你們掌握Android中怎么實(shí)現(xiàn)淘寶下拉刷新效果的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。