您好,登錄后才能下訂單哦!
小編給大家分享一下Android如何實(shí)現(xiàn)通知消息水平播放、無限循環(huán)效果,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
先看效果圖:
這個(gè)效果也很常見,實(shí)現(xiàn)的方法也有很多,我是使用RecyclerView來實(shí)現(xiàn)的,覺得還是挺不錯(cuò)的,就寫下來分享給大家。
下面先看我們的布局文件main.xml,里面主要是一個(gè)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("愛就一個(gè)字,我只說一次"); 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)建一個(gè)List,存放播放的數(shù)據(jù),然后設(shè)置RecyclerView,
我們看一下MyAdapter,在getItemCount()方法里,我們返回的次數(shù)是100000,目的就是為了讓數(shù)據(jù)大一點(diǎn),看似達(dá)到了無限播放的效果,畢竟用戶在一個(gè)界面的停留時(shí)間是有限的,這個(gè)根據(jù)具體業(yè)務(wù)場景,還可以適當(dāng)調(diào)整。在看一下MainActivity的initView方法,設(shè)置好了RecyclerView之后,使用handler發(fā)送一個(gè)空消息,到達(dá)handler的handleMessage
方法,這個(gè)方法的處理,就是我們的核心了, myRecyclerView.scrollBy(myRecyclerView.getScrollX()+2,myRecyclerView.getScrollY());
使用scroolBy,每隔100毫秒發(fā)送一次消息,每次scrollX增加2個(gè)像素位移,即可達(dá)到無限循環(huán)滾動的效果,好神奇。到此我們的功能就實(shí)現(xiàn)了。
下面做兩個(gè)優(yōu)化:
1.第一個(gè)優(yōu)化,
當(dāng)頁面有跳轉(zhuǎn)時(shí),禁止消息滾動,即暫停,當(dāng)頁面回來的時(shí)候再接著滾動。
我們定義一個(gè)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); } }
這樣,在頁面進(jìn)行切換時(shí),消息不再滾動了。
2.第二個(gè)優(yōu)化,
禁止手動滾動消息,最上面那個(gè)效果圖,可以看出,我們可以用手滾動消息,如果不想讓用戶用手滾動,則禁止響應(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); } }
我們的布局文件進(jìn)行相應(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>
這樣就禁止手動滑動了,效果圖就不貼了,可以自己試一下。看起來也不是那么難,但是如果想不到這個(gè)思路,就不好下手了。
Ok,到此結(jié)束。
Android是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機(jī)和平板電腦,由美國Google公司和開放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。
看完了這篇文章,相信你對“Android如何實(shí)現(xiàn)通知消息水平播放、無限循環(huán)效果”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。