走马灯的控件 MarqueeView(继承ViewFlipper),解锁后,走马灯失效的解决方法

xiaoxiao2021-02-28  93

开发过程中,有使用到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

以上方法已在项目中使用过,可以解决问题,如若有错,请指出。谢谢!

效果图如下所示:

转载请注明原文地址: https://www.6miu.com/read-20230.html

最新回复(0)