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

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

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

效果图如下所示:
走马灯的控件 MarqueeView(继承ViewFlipper),解锁后,走马灯失效的解决方法_第1张图片

你可能感兴趣的:(走马灯的控件 MarqueeView(继承ViewFlipper),解锁后,走马灯失效的解决方法)