Chinaunix首页 | 论坛 | 博客
  • 博客访问: 83717
  • 博文数量: 22
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 221
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-28 11:18
文章分类

全部博文(22)

文章存档

2021年(4)

2020年(1)

2016年(10)

2015年(7)

我的朋友

分类: 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.                              }



阅读(1285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~