中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Android中利用ScrollView實現一個頂部懸停效果

發布時間:2020-12-02 16:55:29 來源:億速云 閱讀:468 作者:Leah 欄目:移動開發

這期內容當中小編將會給大家帶來有關如何在Android中利用ScrollView實現一個頂部懸停效果,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

原理:

原理其實很簡單就是對view的gone和visible,寫兩個相同的要置頂的view,一個設置為gone,一個為visible,當可見的view超出屏幕范圍的時候,將不可以的view設置為visible,不可見的view 與scrollview要同級,這樣滑動的時候不會影響到view的位置。

直接上代碼

<&#63;xml version="1.0" encoding="utf-8"&#63;>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
  <com.lanmai.ObservableScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <RelativeLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical">
      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
          <!-- 中間就是填充的view就不寫了-->
          <!--指定要置頂的view-->
        <TextView
          android:id="@+id/specific_text_view"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:background="@android:color/holo_red_dark"
          android:gravity="center"
          android:text="text"
          android:textSize="40sp"/>
        <TextView
          android:layout_width="match_parent"
          android:layout_height="200dp"
          android:background="@android:color/darker_gray"
          android:gravity="center"
          android:text="text"
          android:textSize="40sp"/>
      </LinearLayout>
    </RelativeLayout>
  </com.lanmai.ObservableScrollView>
  <!--指定要置頂的相同的view visibility設置為gone -->
  <TextView
    android:id="@+id/specific_text_view_gone"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/holo_red_dark"
    android:gravity="center"
    android:text="text"
    android:textSize="40sp"
    android:visibility="gone"/>
</RelativeLayout>

接下來要重寫scrollview,為什么要重寫ScrollView,scrollview的滑動監聽事件setOnScrollChangeListener 這個方法是在6.0以上才能用的。為了考慮低版本的的需求,要重寫ScrollView把接口開放出來。

重寫ScrollView

public class ObservableScrollView extends ScrollView {
  private ScrollViewListener scrollViewListener = null;
  public ObservableScrollView(Context context) {
    super(context);
  }
  public ObservableScrollView(Context context, AttributeSet attrs,
                int defStyle) {
    super(context, attrs, defStyle);
  }
  public ObservableScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
  public void setScrollViewListener(ScrollViewListener scrollViewListener) {
    this.scrollViewListener = scrollViewListener;
  }
  @Override
  protected void onScrollChanged(int x, int y, int oldx, int oldy) {
    super.onScrollChanged(x, y, oldx, oldy);
    if (scrollViewListener != null) {
      scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
    }
  }
  public interface ScrollViewListener {
    void onScrollChanged(ScrollView scrollView, int x, int y, int oldx, int oldy);
  }
}

我把重寫的ScrollView命名為ObservableScrollView,重寫三個構造方法,都是換湯不換藥的作法,這里就不贅述。 最重要的是重寫onScrollChanged這個方法,如何把滑動監聽事件開放出去呢,其實也就是寫一個監聽回調,參數和onScrollChanged里面的的參數一樣就可以了,當然主要不是用到這些參數,只是為了判斷ScrollView的滑動事件,參數對于這個功并不是很重要。那這樣,一個簡單的自定義就寫好了scrollview

如何去用?

用法也是挺簡單的,直接上代碼

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scroll_view);
    mTextView = ((TextView) findViewById(R.id.specific_text_view));
    mScrollView = ((ObservableScrollView) findViewById(R.id.scrollview));
    mVisibleTextView = ((TextView) findViewById(R.id.specific_text_view_gone));
    mTextView.setOnClickListener(this);
    mScrollView.setScrollViewListener(this);
  }

這里onCreate方法里面的,也簡單,拿到view 并且設置監聽事件,當然,這里多實現了一個點擊view置頂的功能,監聽設置好以后,實現相應的接,接下來就是重頭戲了

 @Override
  public void onScrollChanged(ScrollView scrollView, int x, int y, int oldx, int oldy) {
    int[] location = new int[2];
    mTextView.getLocationOnScreen(location);
    int xPosition = location[0];
    int yPosition = location[1];
    Log.d("ScrollViewActivity", "yPosition:" + yPosition);
    int statusBarHeight = getStatusBarHeight();
    Log.d("ScrollViewActivity", "statusBarHeight:" + statusBarHeight);
    if (yPosition <= statusBarHeight) {
      mVisibleTextView.setVisibility(View.VISIBLE);
    } else {
      mVisibleTextView.setVisibility(View.GONE);
    }
  }

onScrollChanged這個方法就是自己寫的監聽回調,里面的參數就是Scrollview滑動的時候回調出來的,里面的參數并不用去關心

int[] location = new int[2];
    mTextView.getLocationOnScreen(location);
    int xPosition = location[0];
    int yPosition = location[1];
   /* mTextView就是要懸浮的view,getLocationOnScreen(location)這個方法就是拿到view在屏幕中的位置 ,傳入一個數組,最后得到的yPosition就是view在屏幕中的高度,這里面調用了native層的實現方式,所以數組能直接附上值*/
    // 值得注意的是,拿到的這個高度還包括狀態欄的高度。只要減掉就可以了,狀態欄的高度獲取獲取附上代碼:
public int getStatusBarHeight() {
  int result = 0;
  int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
  if (resourceId > 0) {
    result = getResources().getDimensionPixelSize(resourceId);
  }
  return result;
}
    int statusBarHeight = getStatusBarHeight();
    Log.d("ScrollViewActivity", "statusBarHeight:" + statusBarHeight);
      通過獲取到的狀態欄高度,如果小于狀態欄的高度就表示已經滑出屏幕了,將要置頂的view設置為visibvle否則設置為gone 
    if (yPosition <= statusBarHeight) {
      mVisibleTextView.setVisibility(View.VISIBLE);
    } else {
      mVisibleTextView.setVisibility(View.GONE);
    }

這樣scrollview的懸浮置頂的功能就實現了,這里我也給出點擊view置頂的代碼

@Override
  public void onClick(View v) {
    int[] location = new int[2];
    v.getLocationOnScreen(location);
    int x = location[0];
    int y = location[1];
    mScrollView.scrollBy(0, location[1] - getStatusBarHeight());
  }

    當然要緩慢的滑動過程用smoothScrollBy替代就可以了

上述就是小編為大家分享的如何在Android中利用ScrollView實現一個頂部懸停效果了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

漳州市| 伊川县| 上虞市| 志丹县| 枞阳县| 莱芜市| 元江| 金华市| 镇坪县| 隆回县| 和林格尔县| 萨嘎县| 大理市| 吉木乃县| 齐河县| 南澳县| 昌黎县| 邳州市| 巩义市| 汉阴县| 新竹县| 于都县| 禹州市| 赤水市| 平果县| 仲巴县| 荣成市| 江西省| 靖江市| 五常市| 方山县| 玉田县| 凤凰县| 盐山县| 宜良县| 繁昌县| 札达县| 石景山区| 昭苏县| 抚州市| 神农架林区|