分类: Android平台
2015-11-17 22:23:58
(1)在公司做项目的时候,遇到一个需要添加滑动模块。该滑动模块实现的功能是跳过广告的显示。
通过这个学习了一下onTouch的使用。
代码如下
其中bottom_layout就是为设置可以滑动的模块。
1. bottom_layout.setOnTouchListener(new OnTouchListener() {
2.
3. @Override
4. public boolean onTouch(View arg0, MotionEvent ev) {
5. // TODO Auto-generated method stub
6.
7.
8. boolean returnResult = false;
9.
10. switch (ev.getAction())
11. {
12.
13.
14. case MotionEvent.ACTION_DOWN:
15.
16. float x1=ev.getX();
17. mLastX=x1;
18.
19. bottom_layout.setBackgroundColor(0x99000000);
20. returnResult = true;
21.
22. break;
23.
24. case MotionEvent.ACTION_UP:
25. float x2=ev.getX();
26. float deltaX=x2-mLastX;
27. bottom_layout.setBackgroundColor(0x4c000000);
28. if(deltaX>0){
29.
30. refreshView();
31.
32. mHasShowWelcomeView = true;
33. if (mWelcomeView != null)
34. {
35. mWelcomeView.onDestroy();
36. mWelcomeView = null;
37. }
38. }
39. returnResult = true;
40.
41. break;
42. default:
43.
44. break;
45. }
46. return returnResult;
47.
48. }
49. })
.主要功能就是 当点击该模块的时候,模块的透明度会升高,放开的时候透明度会降低。当滑动的时候回刷新页面,跳过广告页面。
特别需要注意的是每一个case语句都需要设置返回值为真。这样才能保证每一个分支的动作被检测到的时候,会实现相应的功能。此处正是没有意识到这个问题,导致滑动一直没有正式实现,而只是将跳过广告的代码放在ACTION_DOWN中实现了一种伪滑动。其实这样即使你点击一下也会跳过广告。以为DOWN事件,只是检测按下这个动作。
当然此处顺便一提。透明度的设置方法。可以通过十六进制数字进行设置。格式为aabbggrr 前两位为透明度 比如需要设置为透明度为60%。就需要用255*0.6,然后将得到的数字转化为对应的十六进制。
(2)关于handler的使用,具体的原理不太明白,只是会使用。这也是在公司工作的特点。实现的主要功能是如果不使用上面滑动跳过的功能,则屏幕左上角会显示一个TextView,该文本框中会显示广告显示的倒计时。
该代码比较简单。关键问题是在何处启动倒计时的线程,这个考虑了一段时间。
代码如下:
1. clockThread = new Thread(new Runnable(){
2. @Override
3. public void run() {
4.
5. while (timer>0) {
6. try {
7. Thread.currentThread().sleep(1000);
8. timer--;
9. Message msg = new Message();
10. msg.obj = timer;
11. timerHandler.sendMessage(msg);
12. } catch (InterruptedException e) {
13. e.printStackTrace();
14. }
15. }
16. }
17. });
18.
19.
20. timerHandler = new Handler() {
21. public void handleMessage(Message msg) {
22. showTimeView.setText("广告推广 "+msg.obj.toString()+"s");
23. }
24. }
个人感觉就是启动一个线程,然后在该线程中调用handler的sendMessage方法。然后在主线程的activity中创建handler,在handler的handleMessage方法中实现想要完成的UI操作,然后在适当的位置启动线程就可以了。
由于要保证线程在加载广告的时候,才可以进行倒计时。所以在加载广告的方法中启动线程。
1. private void lazyInit()
2. {
3.
4. Handler handler = new Handler()
5. {
6. public void handleMessage(Message msg)
7. {
8. //刷新广告
9. refreshView();
10.
11. mHasShowWelcomeView = true;
12. if (mWelcomeView != null)
13. {
14. mWelcomeView.onDestroy();
15. mWelcomeView = null;
16. }
17.
18. }
19. };
20. handler.sendEmptyMessageDelayed(0, 10000);//由于要保证广告的显示时间。此处的handler发送了一个延迟的信息,因此如果不跳过广告,此处的handler会在10秒后刷新页面
21. clockThread.start();//启动倒计时线程
22. }