开发过程中,有使用到MarqueeView(继承ViewFlipper)实现上下滚动的效果,在未设置滑动解锁的情况下,再次进入界面时,跑马灯动画效果失效,不在滚动。如果设置了滑动解锁的情况下,进入手机界面,跑马灯可继续运行。
对于上述问题,我查阅了资料和上网查询,最终找到了解决的方法, 在自定义控件MarqueeView中设置一个公共方法:setUserPresent(boolean userPresent)和getUserPresent()。 正常解锁的情况下,只需设置setUserPresent(boolean userPresent)方法,对于快速解锁的情况下,需要同时设置这两个方法。 代码如下:
// 正常解锁 通过映射的方法更改属性 使其可被访问 public void setUserPresent(boolean userPresent) { Class clazz = ViewFlipper.class; try { Field f = clazz.getDeclaredField("mUserPresent"); f.setAccessible(true); //设置些属性是可以访问的 f.setBoolean(this, userPresent); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } //快速解锁 还需设置getUserPresent() public boolean getUserPresent() { Class clazz = ViewFlipper.class; try { Field f = clazz.getDeclaredField("mUserPresent"); f.setAccessible(true); //设置些属性是可以访问的 return f.getBoolean(this); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return false; }以上的两个公共方法都是写在自定义的控件中的,如何在我们的页面Activity中去使用它们呐?
因这个问题是出现在解锁的情况下,所以我们可在生命周期中的onStart()方法中去设置………
代码如下:
private MarqueeView marqueeViewOne; //自定义控件 跑马灯 @Override public void onStart() { // TODO Auto-generated method stub super.onStart(); marqueeViewOne.removeAllViews(); marqueeViewOne.setUserPresent(true); marqueeViewOne.startWithList(dataForNormalMoveList); marqueeViewOne.postDelayed(new Runnable() { @Override public void run() { if (!marqueeViewOne.getUserPresent()) { marqueeViewOne.removeAllViews(); marqueeViewOne.setUserPresent(true); //将属性设置为true 可被访问 marqueeViewOne.startWithList(dataForNormalMoveList); // 从新开始运行跑马灯 } } }, 1000); }上述方法中使用了延时方法postDelayed,是一因为手机的不同,解锁时出现时间差,针对于小米手机,设置了延时1S
以上方法已在项目中使用过,可以解决问题,如若有错,请指出。谢谢!
效果图如下所示: