Android 實現(xiàn)通知消息水平播放、無限循環(huán)效果
今天我們來實現(xiàn)一個簡單的效果,通知消息無限循環(huán)播放,先看效果圖:

這個效果也很常見,實現(xiàn)的方法也有很多,我是使用RecyclerView來實現(xiàn)的,覺得還是挺不錯的,就寫下來分享給大家。
下面先看我們的布局文件main.xml,里面主要是一個RecyclerView:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@+id/myRecyclerView" android:layout_width="match_parent" android:layout_height="36dp" android:layout_marginTop="20dp" android:background="#faf7bb" > </android.support.v7.widget.RecyclerView> </LinearLayout>
接下來看一下MainActivity的代碼:
public class MainActivity extends Activity {
@BindView(R.id.myRecyclerView)RecyclerView myRecyclerView;
private List<String> mDatas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ButterKnife.bind(this);
initData();
initView();
}
private void initData(){
mDatas = new ArrayList<>();
mDatas.add("我被青春撞了一下腰");
mDatas.add("愛就一個字,我只說一次");
mDatas.add("你在他鄉(xiāng)還好嗎");
}
private void initView(){
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
myRecyclerView.setLayoutManager(linearLayoutManager);
myRecyclerView.setAdapter(new MyAdapter());
handler.sendEmptyMessageDelayed(0x00,1000);
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
myRecyclerView.scrollBy(myRecyclerView.getScrollX()+2,myRecyclerView.getScrollY());
handler.sendEmptyMessageDelayed(0x00,100);
}
};
}
再看一下Adapter:
class MyAdapter extends RecyclerView.Adapter<MyViewHolder>{
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(MainActivity.this).inflate(R.layout.item_recyclerview,parent,false));
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
final int tempPos = position%(mDatas.size());
holder.textView.setText(mDatas.get(tempPos));
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast toast = Toast.makeText(MainActivity.this,mDatas.get(tempPos),Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
}
});
}
@Override
public int getItemCount() {
return 100000;
}
}
class MyViewHolder extends RecyclerView.ViewHolder{
private TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.tv_recyclerview);
}
}
首先,創(chuàng)建一個List,存放播放的數(shù)據(jù),然后設(shè)置RecyclerView,
我們看一下MyAdapter,在getItemCount()方法里,我們返回的次數(shù)是100000,目的就是為了讓數(shù)據(jù)大一點,看似達到了無限播放的效果,畢竟用戶在一個界面的停留時間是有限的,這個根據(jù)具體業(yè)務(wù)場景,還可以適當調(diào)整。在看一下MainActivity的initView方法,設(shè)置好了RecyclerView之后,使用handler發(fā)送一個空消息,到達handler的handleMessage方法,這個方法的處理,就是我們的核心了,
myRecyclerView.scrollBy(myRecyclerView.getScrollX()+2,myRecyclerView.getScrollY());
使用scroolBy,每隔100毫秒發(fā)送一次消息,每次scrollX增加2個像素位移,即可達到無限循環(huán)滾動的效果,好神奇。到此我們的功能就實現(xiàn)了。
下面做兩個優(yōu)化:
1.第一個優(yōu)化,
當頁面有跳轉(zhuǎn)時,禁止消息滾動,即暫停,當頁面回來的時候再接著滾動。
我們定義一個boolean類型的變量,在onStop和onRestart方法里分別賦值,
private boolean flag;
@Override
protected void onRestart() {
flag = false;
handler.sendEmptyMessageDelayed(0x00,100);
super.onRestart();
}
@Override
protected void onStop() {
flag = true;
super.onStop();
}
接著,handler的handlerMessage方法稍微也改一下:
@Override
public void handleMessage(Message msg) {
myRecyclerView.scrollBy(myRecyclerView.getScrollX() + 2, myRecyclerView.getScrollY());
if (!flag) {
handler.sendEmptyMessageDelayed(0x00, 100);
}
}
這樣,在頁面進行切換時,消息不再滾動了。
2.第二個優(yōu)化,
禁止手動滾動消息,最上面那個效果圖,可以看出,我們可以用手滾動消息,如果不想讓用戶用手滾動,則禁止響應(yīng)move事件即可,由我們的布局文件可知,RecyclerView的父布局是LinearLayout,我們可以自定義LinearLayout,攔截掉move事件即可,代碼如下:
public class ForbidMoveLinearLayout extends LinearLayout {
public ForbidMoveLinearLayout(Context context) {
super(context);
}
public ForbidMoveLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ForbidMoveLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_MOVE){
return true;
}
return super.onInterceptTouchEvent(ev);
}
}
我們的布局文件進行相應(yīng)調(diào)整:
<?xml version="1.0" encoding="utf-8"?> <com.example.administrator.helloapplication.ForbidMoveLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@+id/myRecyclerView" android:layout_width="match_parent" android:layout_height="36dp" android:layout_marginTop="20dp" android:background="#faf7bb" > </android.support.v7.widget.RecyclerView> </com.example.administrator.helloapplication.ForbidMoveLinearLayout>
這樣就禁止手動滑動了,效果圖就不貼了,可以自己試一下。看起來也不是那么難,但是如果想不到這個思路,就不好下手了。
Ok,到此結(jié)束。
總結(jié)
以上所述是小編給大家介紹的Android 實現(xiàn)通知消息水平播放、無限循環(huán)效果,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!
相關(guān)文章
Android Flutter實現(xiàn)圖片滑動切換效果
Flutter 為了簡化開發(fā),提供了不少轉(zhuǎn)換動畫組件,這類組件通常命名為 xxTransition。本篇要介紹的就是 SlideTransition,并用它實現(xiàn)圖片滑動切換效果,感興趣的可以了解一下2022-04-04
Android 實現(xiàn)ViewPager邊界回彈效果實例代碼
這篇文章主要介紹了Android 實現(xiàn)ViewPager邊界回彈效果的實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05
Android LayoutTransiton實現(xiàn)簡單的錄制按鈕
這篇文章主要介紹了Android LayoutTransiton實現(xiàn)簡單的錄制按鈕,主要實現(xiàn)開始,暫停,停止和顯示錄制時間長度,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06
Android自定義view實現(xiàn)列表內(nèi)左滑刪除Item
這篇文章主要介紹了微信小程序列表中item左滑刪除功能,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02
Android亮度調(diào)節(jié)的幾種實現(xiàn)方法
本篇文章詳細介紹了Android亮度調(diào)節(jié)的幾種實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-11-11

