java - 做一個視頻播放器,想實現(xiàn)一個功能,如果3秒不點擊屏幕任何,則下方一個界面布局(顯示按鈕那些的)自動消失。
問題描述
就是這個功能不知道怎么實現(xiàn),就像很多視頻播放器那種,如果點擊屏幕任何,下方界面布局(顯示按鈕那些的)就顯示出來,然后等幾秒鐘沒有點擊,就消失。先貼個代碼:
sv.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (linearLayout.getVisibility()==View.INVISIBLE) linearLayout.setVisibility(View.VISIBLE); Timer timer=new Timer(); timer.schedule(new TimerTask() { @Override public void run() { linearLayout.setVisibility(View.VISIBLE); } },3000); return false; } });
這種方法不行的,會拋出異常,但是我感覺這個思路沒有錯,肯定是設(shè)置一個surfaceview的觸摸事件監(jiān)聽器,但是真的不知道如何實現(xiàn)。以上拋出只有原本的線程能操作ui線程,也就是說主要問題是timer這個線程無法操作setvisibility,但是如果不加入其它線程,又如何實現(xiàn)這個功能,不可能在監(jiān)聽器里面用一個延遲函數(shù),如果在這3秒內(nèi)又又一次觸摸時間,那肯定是要刷新這個時間的啊。。的確沒想到解決方法。。。
問題解答
回答1:不需要Timer
Handler mHandler = new Handler();Runnable mRunnable;mRunnable = new Runnable() { @Override public void run() { //隱藏view }};myView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_DOWN){ mHandler.removeCallbacks(mRunnable); //顯示你的view}else if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL){ mHandler.postDelayed(mRunnable,3000);}return false; }});回答2:
你在子線程操作UI線程了,這是禁止的,加個handlder
Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) {super.handleMessage(msg);linearLayout.setVisibility(View.VISIBLE); }}; timer.schedule(new TimerTask() {@Overridepublic void run() { //linearLayout.setVisibility(View.VISIBLE); mHandler.sendEmptyMessage(0);}},3000);回答3:
runOnUiThread
回答4:發(fā)一個延遲的handler去隱藏布局就可以了。在子線程操作UI會有意想不到的問題。
回答5:試試使用Handler.postDelay()這個方法。
Time lastTime;觸摸屏幕if(View.VISIBLE){ setVisibility(View.INVISIBLE);} else{ setVisibility(View.VISIBLE); lastTime= new Time(); Handler.postDelay(3000);}Handler.handleMessage{ if(View.VISIBLE){ if(new Time()-lastTime>3S){ setVisibility(View.INVISIBLE); } }}回答6:
直接用
new Handler().postDelayed(new Runnable(){ @Override public void run(){method() }}, 3000);
相關(guān)文章:
