仿ios 可滑動的ScrollView

2021-09-17 20:09:01 字數 4543 閱讀 5094

本人在開發過程中頁面效果由於使用android本身控制項無法達到ios那種可拉伸的view,感到很不爽,因為ios總是可以滑動,避免再新增功能時重新布局的麻煩,所以整了一下,顯示了可拉伸的view,終於可以與ios保持一致了.

建立乙個自定義view ,userdefinescrollview 繼承scrollview,

// 移動因子, 是乙個百分比, 比如手指移動了100px, 那麼view就只移動50px

// 目的是達到乙個延遲的效果

private static final float move_factor = 0.5f;

// 鬆開手指後, 介面回到正常位置需要的動畫時間

private static final int anim_time = 300;

// scrollview的子view, 也是scrollview的唯一乙個子view

private view contentview;

// 手指按下時的y值, 用於在移動時計算移動距離

// 如果按下時不能上拉和下拉, 會在手指移動時更新為當前手指的y值

private float starty;

float nowy;

int deltay;

// 用於記錄正常的布局位置

private rect originalrect = new rect();

// 手指按下時記錄是否可以繼續下拉

private boolean canpulldown = false;

// 手指按下時記錄是否可以繼續上拉

private boolean canpullup = false;

// 在手指滑動的過程中記錄是否移動了布局

private boolean ismoved = false;

private ixlistviewlistener mlistviewlistener;

實現自定義view的三個構造方法,

接著實現onlayout() ,設定布局位置

@override

protected void onlayout(boolean changed, int l, int t, int r, int b)

分發事件開始;

當前布局滑動的超過底部或者頂部,表示已經滑動出scrollview之外,

istouchoutofscrollview = ev.gety() >= this.getheight() || ev.gety() <= 0

if (istouchoutofscrollview)
開啟動畫回到原來位置

/**

* 將內容布局移動到原位置 可以在up事件中呼叫, 也可以在其他需要的地方呼叫, 如手指移動到當前scrollview外時

*/private void boundback()

}

判斷是否滾動到頂部和底部

/**

* 判斷是否滾動到頂部

*/private boolean iscanpulldown()

/*** 判斷是否滾動到底部

*/private boolean iscanpullup()

/**

* 在觸控事件中, 處理上拉和下拉的邏輯

*/@override

public boolean dispatchtouchevent(motionevent ev)

// 手指是否移動到了當前scrollview控制項之外

boolean istouchoutofscrollview = ev.gety() >= this.getheight()

|| ev.gety() <= 0;

// if(ev.gety() >= this.getheight())

// if(ev.gety() <= 0)

//

// log.e("wudi", "ev.gety() <= 0="+ev.gety()+",height="+ this.getheight());

// mlistviewlistener.ondexy((int)ev.gety());

if (istouchoutofscrollview)

int action = ev.getaction();

switch (action)

// 計算手指移動的距離

nowy = ev.gety();

deltay = (int) (nowy - starty);

// 是否應該移動布局

boolean shouldmove = (canpulldown && deltay > 0) // 可以下拉, 並且手指向下移動

|| (canpullup && deltay < 0) // 可以上拉, 並且手指向上移動

|| (canpullup && canpulldown); // 既可以上拉也可以下拉(這種情況出現在scrollview包裹的控制項比scrollview還小)

if (shouldmove)

break;

default:

break;

}return super.dispatchtouchevent(ev);

}

整理後的view

public class userdefinescrollview extends scrollview

public userdefinescrollview(context context, attributeset attrs)

@suppresslint("missingsupercall")

@override

protected void onfinishinflate()

}@override

protected void onlayout(boolean changed, int l, int t, int r, int b)

/*** 在觸控事件中, 處理上拉和下拉的邏輯

*/@override

public boolean dispatchtouchevent(motionevent ev)

// 手指是否移動到了當前scrollview控制項之外

boolean istouchoutofscrollview = ev.gety() >= this.getheight()

|| ev.gety() <= 0;

// if(ev.gety() >= this.getheight())

// if(ev.gety() <= 0)

//

// log.e("wudi", "ev.gety() <= 0="+ev.gety()+",height="+ this.getheight());

// mlistviewlistener.ondexy((int)ev.gety());

if (istouchoutofscrollview)

int action = ev.getaction();

switch (action)

// 計算手指移動的距離

nowy = ev.gety();

deltay = (int) (nowy - starty);

// 是否應該移動布局

boolean shouldmove = (canpulldown && deltay > 0) // 可以下拉, 並且手指向下移動

|| (canpullup && deltay < 0) // 可以上拉, 並且手指向上移動

|| (canpullup && canpulldown); // 既可以上拉也可以下拉(這種情況出現在scrollview包裹的控制項比scrollview還小)

if (shouldmove)

break;

default:

break;

}return super.dispatchtouchevent(ev);

}/**

* 將內容布局移動到原位置 可以在up事件中呼叫, 也可以在其他需要的地方呼叫, 如手指移動到當前scrollview外時

*/private void boundback()

}@override

protected void onscrollchanged(int l, int t, int oldl, int oldt)

/*** 判斷是否滾動到頂部

*/private boolean iscanpulldown()

/*** 判斷是否滾動到底部

*/private boolean iscanpullup()

public void setmlistviewlistener(ixlistviewlistener mlistviewlistener)

public inte***ce ixlistviewlistener

}

仿ios中layout的滑動效果

package code.suibianchou.com.custormview2 import android.annotation.suppresslint import android.content.context import android.graphics.rect import an...

SwipeListView實現仿ios的側滑

今天介紹乙個swipemenulistview實現側滑刪除的例子,其實和listview的用法一樣,就是多了建立刪除等view的步驟,然後通過addview新增到父布局中。效果如果 當然你也也可以根據自己的需要增加更多的自定義view。直接看 吧 compile com.baoyz.swipemen...

Android可滑動的開關效果

閒著沒事,把之前寫的乙個demo放上來分享下。就是乙個開關,實現可滑動和動畫效果。不是切換。好了,先上圖 直接把自定義的這個view 放上來,有注釋應該很好理解 首先是布局 接著是這個view的 繼承自linearlayout package com.lxb.switchdemo import an...