最近項(xiàng)目需求要實(shí)現(xiàn)RecyclerView的分頁(yè)滑動(dòng) 先上效果圖如下(視頻壓縮成的gif所以滑動(dòng)切換效果有點(diǎn)卡頓了 效果為每頁(yè)三條數(shù)據(jù)的滑動(dòng))
站在用戶的角度思考問題,與客戶深入溝通,找到?jīng)鲋菥W(wǎng)站設(shè)計(jì)與涼州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋涼州地區(qū)。
對(duì)于Android中的手勢(shì)識(shí)別可以從以下三個(gè)Listener入手——OnTouchListener、OnGestureListener、OnDoubleTapListener。這三個(gè)監(jiān)聽器分別是觸摸監(jiān)聽、手勢(shì)滑動(dòng)監(jiān)聽和屏幕雙擊操作監(jiān)聽。很多的時(shí)候我們需要這些手勢(shì)識(shí)別的操作,例如我們自定義控件的時(shí)候就經(jīng)常會(huì)用到。下面就對(duì)這三個(gè)監(jiān)聽器分別進(jìn)行介紹。
觸摸監(jiān)聽器OnTouchListener
讓我們的Activity去現(xiàn)實(shí)此接口,并重寫onTouch方法。重寫OnTouchListener的onTouch方法 此方法在觸摸屏被觸摸,即發(fā)生觸摸事件(接觸和撫摸兩個(gè)事件)的時(shí)候被調(diào)用。示范代碼如下:
@Override
public boolean onTouch(View v, MotionEvent event) {
detector.onTouchEvent(event);
Toast.makeText(this, "onTouch", TIME_OUT).show();
return true;
}
手勢(shì)滑動(dòng)監(jiān)聽器OnGestureListener
讓我們的Activity去現(xiàn)實(shí)此接口,并重寫onFling、onLongPress、onScroll、onDown、onShowPress、onSingleTapUp方法。示范代碼如下:
/**
* 手勢(shì)滑動(dòng)時(shí)別調(diào)用
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (e1.getX() - e2.getX() FLING_MIN_DISTANCE) {
Toast.makeText(this, "向左滑動(dòng)", TIME_OUT).show();
} else if (e2.getX() - e1.getX() FLING_MIN_DISTANCE) {
Toast.makeText(this, "向右滑動(dòng)", TIME_OUT).show();
}
return false;
}
/**
* 長(zhǎng)按時(shí)被調(diào)用
*/
@Override
public void onLongPress(MotionEvent e) {
Toast.makeText(this, "觸發(fā)長(zhǎng)按回調(diào)", TIME_OUT).show();
}
/**
* 滾動(dòng)時(shí)調(diào)用
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
Toast.makeText(this, "觸發(fā)滾動(dòng)回調(diào)", TIME_OUT).show();
return false;
}
/**
* 在按下動(dòng)作時(shí)被調(diào)用
*/
@Override
public boolean onDown(MotionEvent e) {
Toast.makeText(this, "按下回調(diào)", TIME_OUT).show();
return false;
}
/**
* 按住時(shí)被調(diào)用
*/
@Override
public void onShowPress(MotionEvent e) {
Toast.makeText(this, "按住不松回調(diào)", TIME_OUT).show();
}
/**
* 抬起時(shí)被調(diào)用
*/
@Override
public boolean onSingleTapUp(MotionEvent e) {
Toast.makeText(this, "觸發(fā)抬起回調(diào)", TIME_OUT).show();
return false;
}
雙擊屏幕監(jiān)聽器OnDoubleTapListener
讓我們的Activity去現(xiàn)實(shí)此接口,并重寫onDoubleTap、onDoubleTapEvent、onSingleTapConfirmed方法。示范代碼如下:
@Override
public boolean onDoubleTap(MotionEvent arg0) {
Toast.makeText(this, "觸發(fā)雙擊回調(diào)", TIME_OUT).show();
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent arg0) {
Toast.makeText(this, "觸發(fā)雙擊的按下跟抬起回調(diào)", TIME_OUT).show();
return false;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent arg0) {
Toast.makeText(this, "觸發(fā)單擊確認(rèn)回調(diào)", TIME_OUT).show();
return false;
}
本文主要介紹采用RecyclerView配合PagerSnapHelper實(shí)現(xiàn)短視頻滑動(dòng)播放內(nèi)容。
主頁(yè)布局文件定義RecyclerView,為RecyclerView建立對(duì)應(yīng)適配器。
適配器條目中添加視頻播放容器FrameLayout及封面ImageVIew.
PagerSnapHelper 結(jié)合 LinearLayoutManager 實(shí)現(xiàn)滑動(dòng)管理,實(shí)現(xiàn)監(jiān)聽任務(wù)。
PagerSnapHelper can help achieve a similar behavior to
ViewPager. Set both RecyclerView and the items of the RecyclerView.Adapter to have android.view.ViewGroup.LayoutParams#MATCH_PARENT height and width and then attach PagerSnapHelper to the RecyclerView using #attachToRecyclerView(RecyclerView)}.
RecyclerView管理器為L(zhǎng)inearLayoutManager 時(shí),默認(rèn)為縱向滑動(dòng),如果想采用橫向滑動(dòng),就設(shè)置其滑動(dòng)方向?yàn)镽ecyclerView.HORIZONTAL。同理,我們也可以這樣采用setOrientation(RecyclerView.HORIZONTAL) 方法去改變滑動(dòng)方向。
為RecyclerView 設(shè)置管理器PagerLayoutManager,設(shè)置其Adapter數(shù)據(jù)內(nèi)容,進(jìn)行封面展示,且此時(shí)會(huì)回調(diào)onPageInitComplete()方法,進(jìn)行首個(gè)視頻播放。對(duì)RecyclerView進(jìn)行滑動(dòng),當(dāng)頁(yè)面滑動(dòng)結(jié)束后,會(huì)先回調(diào)管理器中onPageRelease()方法,此時(shí)可對(duì)進(jìn)行中播放器進(jìn)行停止釋放;然后,回調(diào)onPageSelected()方法,對(duì)選中頁(yè)面內(nèi)容進(jìn)行展示播放。
當(dāng)滑動(dòng)后取消時(shí),要進(jìn)行判斷當(dāng)前位置,避免當(dāng)前頁(yè)視頻停止或重復(fù)播放。
初始化播放器內(nèi)容
開始播放視頻內(nèi)容,進(jìn)行播放器視圖加載
停止播放,移除視圖
例子中采用了自定義空布局的播放器繼承自GSY開源播放器,單純進(jìn)行視頻播放,當(dāng)然也可以采用其它的播放器餃子或者IjkPlayer等。
布局文件
簡(jiǎn)單的滑動(dòng)播放這些就完成了,例子也只是僅僅提供了實(shí)現(xiàn)的方法和思路,供大家進(jìn)行學(xué)習(xí)參考,實(shí)際使用中可以對(duì)其進(jìn)一步地進(jìn)行封裝及處理,接下來也會(huì)補(bǔ)充一些滑動(dòng)播放適配器的數(shù)據(jù)加載處理以及多布局內(nèi)容展示等內(nèi)容。
TextView 內(nèi)容過多可滑動(dòng)
第一步:添加android:scrollbars="vertical" 屬性,指可以橫向滑動(dòng)還是豎向滑動(dòng)
TextView android:scrollbars="vertical"android:id="@+id/tv_brief"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_marginLeft="19dp"android:includeFontPadding="false"android:textColor="#333333"android:textSize="15dp"/
第二步:給這個(gè)控件設(shè)置,這個(gè)屬性必須加
TextView支持點(diǎn)擊tv.setMovementMethod(ScrollingMovementMethod.getInstance());
EditText 內(nèi)容過多可滑動(dòng)
繼承自scrollview 就可以了
public class ScrollViewYhqextends ScrollView {
private ContextmContext;
public ScrollViewYhq(Context context, AttributeSet attrs) {
super(context, attrs);
? ? init(context);
}
public ScrollViewYhq(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
? ? init(context);
}
private void init(Context context) {
mContext = context;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
try {
//最大高度顯示為屏幕內(nèi)容高度的一半
? ? ? ? Display display = ((Activity)mContext).getWindowManager().getDefaultDisplay();
? ? ? ? DisplayMetrics d =new DisplayMetrics();
? ? ? ? display.getMetrics(d);
? ? ? ? //此處是關(guān)鍵,設(shè)置控件高度不能超過屏幕高度一半(d.heightPixels / 2)
? ? ? ? heightMeasureSpec = MeasureSpec.makeMeasureSpec(PXUtil.dip2px(140), MeasureSpec.AT_MOST);//這里我設(shè)置了140dp
? ? }catch (Exception e) {
e.printStackTrace();
? ? }
//重新計(jì)算控件高、寬
? ? super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
無(wú)法更改,安卓的安全性很高,所以更改的權(quán)限也是比較少的。
Android本身是一個(gè)權(quán)限分立的操作系統(tǒng)。在這類操作系統(tǒng)中,每個(gè)應(yīng)用都以一個(gè)系統(tǒng)識(shí)別身份運(yùn)行(Linux用戶ID與群組ID)。系統(tǒng)的各部分也分別使用各自獨(dú)立的識(shí)別方式。Linux就是這樣將應(yīng)用與應(yīng)用,應(yīng)用與系統(tǒng)隔離開。
擴(kuò)展資料:
Android本身是一個(gè)權(quán)限分立的操作系統(tǒng)。在這類操作系統(tǒng)中,每個(gè)應(yīng)用都以一個(gè)系統(tǒng)識(shí)別身份運(yùn)行(Linux用戶ID與群組ID)。系統(tǒng)的各部分也分別使用各自獨(dú)立的識(shí)別方式。Linux就是這樣將應(yīng)用與應(yīng)用,應(yīng)用與系統(tǒng)隔離開。
系統(tǒng)更多的安全功能通過權(quán)限機(jī)制提供。權(quán)限可以限制某個(gè)特定進(jìn)程的特定操作,也可以限制每個(gè)URI權(quán)限對(duì)特定數(shù)據(jù)段的訪問。
Android安全架構(gòu)的核心設(shè)計(jì)思想是,在默認(rèn)設(shè)置下,所有應(yīng)用都沒有權(quán)限對(duì)其他應(yīng)用、系統(tǒng)或用戶進(jìn)行較大影響的操作。這其中包括讀寫用戶隱私數(shù)據(jù)(聯(lián)系人或電子郵件),讀寫其他應(yīng)用文件,訪問網(wǎng)絡(luò)或阻止設(shè)備待機(jī)等。
安裝應(yīng)用時(shí),在檢查程序簽名提及的權(quán)限,且經(jīng)過用戶確認(rèn)后,軟件包安裝器會(huì)給予應(yīng)用權(quán)限。從用戶角度看,一款A(yù)ndroid應(yīng)用通常會(huì)要求如下的權(quán)限:
撥打電話、發(fā)送短信或彩信、修改/刪除SD卡上的內(nèi)容、讀取聯(lián)系人的信息、讀取日程信的息,寫入日程數(shù)據(jù)、讀取電話狀態(tài)或識(shí)別碼、精確的(基于GPS)地理位置、模糊的(基于網(wǎng)絡(luò)獲取)地理位置、創(chuàng)建藍(lán)牙連接、對(duì)互聯(lián)網(wǎng)的完全訪問、查看網(wǎng)絡(luò)狀態(tài)。
一款應(yīng)用應(yīng)該根據(jù)自身提供的功能,要求合理的權(quán)限。用戶也可以分析一款應(yīng)用所需權(quán)限,從而簡(jiǎn)單判定這款應(yīng)用是否安全。如一款應(yīng)用是不帶廣告的單機(jī)版,也沒有任何附加的內(nèi)容需要下載,那么它要求訪問網(wǎng)絡(luò)的權(quán)限就比較可疑。
參考資料來源:百度百科-Android