国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android自定義控件ScrollView實(shí)現(xiàn)上下滑動(dòng)功能

2019-12-12 00:41:05
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例為大家分享了Android ScrollView實(shí)現(xiàn)上下滑動(dòng)功能的具體代碼,供大家參考,具體內(nèi)容如下

package com.example.zhuang;import android.content.Context;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.Scroller;public class MyScrollView extends ViewGroup {  private int mScreeHeight;//屏幕高度  private Scroller mScroller;  private int mLastY;  private int mStart;  private int mEnd;  private Context context;  public MyScrollView(Context context) {    super(context);    initView(context);  }  public MyScrollView(Context context, AttributeSet attrs) {    super(context, attrs);    initView(context);  }  public MyScrollView(Context context, AttributeSet attrs,            int defStyleAttr) {    super(context, attrs, defStyleAttr);    initView(context);  }  private void initView(Context context) {    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);    //DisplayMetrics 類提供了一種關(guān)于顯示的通用信息,如顯示大小,分辨率和字體。    DisplayMetrics dm = new DisplayMetrics();    wm.getDefaultDisplay().getMetrics(dm);    mScreeHeight = dm.heightPixels;//高度(像素)    mScroller = new Scroller(context);  }  //繼承ViewGroup必須要實(shí)現(xiàn)的方法  @Override  protected void onLayout(boolean changed, int l, int t, int r, int b) {    int childCount = getChildCount();//獲取子view的個(gè)數(shù)    //設(shè)置ViewGroup的高度    MarginLayoutParams mlp = (MarginLayoutParams) getLayoutParams();    mlp.height = mScreeHeight * childCount;    setLayoutParams(mlp);    for (int i = 0; i < childCount; i++) {      View child = getChildAt(i);      if (child.getVisibility() != View.GONE) {        //參數(shù)為相對(duì)父容器的左上右下位置,第三個(gè)參數(shù)必須為r        child.layout(0, i * mScreeHeight, r, (i + 1) * mScreeHeight);      }    }  }  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    int count = getChildCount();    for (int i = 0; i < count; i++) {      View child = getChildAt(i);      measureChild(child, widthMeasureSpec, heightMeasureSpec);    }  }  @Override  public boolean onTouchEvent(MotionEvent event) {    int y = (int) event.getY();//相對(duì)于view的y值,getRawY()是相對(duì)屏幕    switch (event.getAction()) {      case MotionEvent.ACTION_DOWN:        mLastY = y;//上一次的y值        mStart = getScrollY();//記錄觸摸起點(diǎn)        break;      case MotionEvent.ACTION_MOVE:        if(!mScroller.isFinished()) {          mScroller.abortAnimation();//放棄移到最終位置        }        int dy = mLastY - y;//偏移距離        //如果滑動(dòng)距離小于0或大于屏幕高度,不偏移        if(getScrollY()<0){          dy = 0;        }        if(getScrollY() > getHeight()-mScreeHeight){          dy = 0;        }        scrollBy(0,dy);//移動(dòng)        mLastY = y;        break;      case MotionEvent.ACTION_UP:        int dScrollY = checkAlignment();//整體移動(dòng)的距離        if(dScrollY > 0){          if(dScrollY < mScreeHeight / 3){            mScroller.startScroll(0,getScrollY(),0,-dScrollY);          }else{            mScroller.startScroll(0,getScrollY(),0,mScreeHeight-dScrollY);          }        }else{          if(-dScrollY < mScreeHeight / 3){            mScroller.startScroll(0,getScrollY(),0,-dScrollY);          }else{            mScroller.startScroll(0,getScrollY(),0,-mScreeHeight-dScrollY);          }        }        break;    }    postInvalidate();    return true;  }  private int checkAlignment(){     mEnd = getScrollY();//記錄觸摸終點(diǎn)    boolean isUp = ((mEnd - mStart)>0) ? true : false;    int lastPrev = mEnd % mScreeHeight;    int lastNext = mScreeHeight - lastPrev;    if(isUp){      return lastPrev;//向上    }else      return -lastNext;  }  @Override  public void computeScroll() {    super.computeScroll();    if(mScroller.computeScrollOffset()){//返回true,表示還未移動(dòng)完      scrollTo(0,mScroller.getCurrY());//移到當(dāng)前位置      postInvalidate();      //invalidate()是用來(lái)刷新View的,必須是在UI線程中進(jìn)行工作。      //postInvalidate()可以在非UI線程調(diào)用    }  }}

知識(shí)點(diǎn):

1、獲取屏幕參數(shù)代碼:

DisplayMetrics metric = new DisplayMetrics(); //API 17之后使用,獲取的像素寬高包含虛擬鍵所占空間,在API 17之前通過(guò)反射獲取 context.getWindowManager().getDefaultDisplay().getRealMetrics(metric); //獲取的像素寬高不包含虛擬鍵所占空間 //context.getWindowManager().getDefaultDisplay().getMetrics(metric); int width = metric.widthPixels; // 寬度(像素) int height = metric.heightPixels; // 高度(像素) float density = metric.density; // dp縮放因子 int densityDpi = metric.densityDpi; // 廣義密度 float xdpi = metric.xdpi;//x軸方向的真實(shí)密度 float ydpi = metric.ydpi;//y軸方向的真實(shí)密度 

屏幕高度值包含了狀態(tài)欄的像素,非沉浸模式下真實(shí)的Activity高度需要減去狀態(tài)欄的高度。獲取狀態(tài)欄高度代碼:

private int getStatusBarHeight() {   Rect rect = new Rect();   getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);   return rect.top; } 

屏幕參數(shù)Width和Height的值和屏幕方向有關(guān),另外4個(gè)值和屏幕方向無(wú)關(guān)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 邻水| 丰宁| 盐亭县| 临澧县| 南和县| 黄平县| 汉寿县| 齐河县| 江达县| 麟游县| 巴林右旗| 大邑县| 阳新县| 民权县| 若羌县| 元谋县| 梁山县| 洪泽县| 马尔康县| 平舆县| 绥宁县| 军事| 澎湖县| 中方县| 中牟县| 来凤县| 潍坊市| 平乡县| 八宿县| 荆门市| 无极县| 南充市| 佛教| 冷水江市| 江陵县| 宁明县| 年辖:市辖区| 平顶山市| 大关县| 从江县| 南召县|