本人在開發過程中頁面效果由於使用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...