开发过程中,有使用到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
以上方法已在项目中使用过,可以解决问题,如若有错,请指出。谢谢!
效果图如下所示: