Coder Social home page Coder Social logo

sunfusheng / marqueeview Goto Github PK

View Code? Open in Web Editor NEW
3.8K 84.0 671.0 12.06 MB

俗名:可垂直跑、可水平跑的跑马灯;学名:可垂直翻、可水平翻的翻页公告

Home Page: https://github.com/sunfusheng/MarqueeView

Java 92.46% HTML 7.54%
marqueeview marquee

marqueeview's Introduction

MarqueeView MarqueeView

俗名:可垂直跑、可水平跑的跑马灯
学名:可垂直翻、可水平翻的翻页公告

效果图

Gradle:

compile 'com.sunfusheng:MarqueeView:<latest-version>'

属性

Attribute 属性 Description 描述
mvAnimDuration 一行文字动画执行时间
mvInterval 两行文字翻页时间间隔
mvTextSize 文字大小
mvTextColor 文字颜色
mvGravity 文字位置:left、center、right
mvSingleLine 单行设置
mvDirection 动画滚动方向:bottom_to_top、top_to_bottom、right_to_left、left_to_right
mvFont 设置字体

XML

<com.sunfusheng.marqueeview.MarqueeView
    android:id="@+id/marqueeView"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    app:mvAnimDuration="1000"
    app:mvDirection="bottom_to_top"
    app:mvInterval="3000"
    app:mvTextColor="@color/white"
    app:mvTextSize="14sp"
    app:mvSingleLine="true"
    app:mvFont="@font/huawenxinwei"/>

设置字符串列表数据,或者设置自定义的Model数据类型

MarqueeView marqueeView = (MarqueeView) findViewById(R.id.marqueeView);

List<String> messages = new ArrayList<>();
messages.add("1. 大家好,我是孙福生。");
messages.add("2. 欢迎大家关注我哦!");
messages.add("3. GitHub帐号:sunfusheng");
messages.add("4. 新浪微博:孙福生微博");
messages.add("5. 个人博客:sunfusheng.com");
messages.add("6. 微信公众号:孙福生");
marqueeView.startWithList(messages);

// 或者设置自定义的Model数据类型
public class CustomModel implements IMarqueeItem {
    @Override
    public CharSequence marqueeMessage() {
        return "...";
    }
}

List<CustomModel> messages = new ArrayList<>();
marqueeView.startWithList(messages);

// 在代码里设置自己的动画
marqueeView.startWithList(messages, R.anim.anim_bottom_in, R.anim.anim_top_out);

设置字符串数据

String message = "心中有阳光,脚底有力量!心中有阳光,脚底有力量!心中有阳光,脚底有力量!";
marqueeView.startWithText(message);

// 在代码里设置自己的动画
marqueeView.startWithText(message, R.anim.anim_bottom_in, R.anim.anim_top_out);

设置事件监听

marqueeView.setOnItemClickListener(new MarqueeView.OnItemClickListener() {
    @Override
    public void onItemClick(int position, TextView textView) {
        Toast.makeText(getApplicationContext(), String.valueOf(marqueeView1.getPosition()) + ". " + textView.getText(), Toast.LENGTH_SHORT).show();
    }
});

重影问题可参考以下解决方案

在 Activity 或 Fragment 中

@Override
public void onStart() {
    super.onStart();
    marqueeView.startFlipping();
}

@Override
public void onStop() {
    super.onStop();
    marqueeView.stopFlipping();
}

在 ListView 或 RecyclerView 的 Adapter 中

@Override
public void onViewDetachedFromWindow(@NonNull ViewHolder holder) {
    super.onViewDetachedFromWindow(holder);
    holder.marqueeView.stopFlipping();
}

扫一扫Fir.im二维码下载APK


个人微信公众号


打点赏给作者加点油^_^


关于我

GitHub: sunfusheng

个人邮箱: [email protected]

个人博客: sunfusheng.com

简书主页

新浪微博

marqueeview's People

Contributors

myxh avatar rightmancode avatar sunfusheng avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

marqueeview's Issues

1.2.0升级1.3.0使用单行文本出现找不到动画,还有能不能先解决英文没办法充满一行的问题?

Process: com.aite.fivemillion, PID: 6534
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.animation.Animation.setAnimationListener(android.view.animation.Animation$AnimationListener)' on a null object reference
at com.sunfusheng.marqueeview.MarqueeView.start(MarqueeView.java:211)
at com.sunfusheng.marqueeview.MarqueeView.startWithFixedWidth(MarqueeView.java:174)
at com.sunfusheng.marqueeview.MarqueeView.access$000(MarqueeView.java:23)
at com.sunfusheng.marqueeview.MarqueeView$1.onGlobalLayout(MarqueeView.java:141)
at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:912)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1996)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1134)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6050)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:860)
at android.view.Choreographer.doCallbacks(Choreographer.java:672)
at android.view.Choreographer.doFrame(Choreographer.java:608)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:846)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:150)

没有任何显示

marqueeView1 = (MarqueeView) view.findViewById(R.id.marqueeView1);
List info = new ArrayList<>();
info.add("1. 大家好,我是孙福生。");
info.add("2. 欢迎大家关注我哦!");
info.add("3. GitHub帐号:sfsheng0322");
info.add("4. 新浪微博:孙福生微博");
info.add("5. 个人博客:sunfusheng.com");
info.add("6. 微信公众号:孙福生");
marqueeView1.startWithList(info);

image

对于这个View我有个建议,不知道作者能否改进?

应该加入其他JAVA bean可以传入集合的操作!具体实现,你可以构造一个接口,写一个获取文本的接口方法,这样别人JAVA Bean可以去实现这个接口,从来你在View里面也可以通过接口方法获取到跑马灯文本!

在activity里面使用的 问题

老哥,我copy你的代码的.然后一进入页面 第一条条目会先闪一下 然后再从第一条到最后一条重复滚动

重叠字

fragment来回切换的时候会经常出现重叠字

关于重复创建对象问题startWithList(List<? extends CharSequence> notices)

for(final int i = 0; i < this.notices.size(); ++i) {
final TextView textView = this.createTextView((CharSequence)this.notices.get(i), i);
textView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(MarqueeView.this.onItemClickListener != null) {
MarqueeView.this.onItemClickListener.onItemClick(i, textView);
}

                }
            });
            this.addView(textView);
        }

假如,list数据是后端返回的,可能是一些简短的鸡汤文,上千上万条,解析之后list的size可能很大,这里创建TextView的方式比较简单粗暴,直接循环,new TextView会不会有问题呢

下载的apk闪退

06-07 15:00:07.936 2462-2750/? E/NewLauncher: StartActivity : DEBUG : launchApplication useFlipAnim [true]
06-07 15:00:07.946 2462-30103/? E/NewLauncher: IconCellShoter : ### getIconCellShot in !!
06-07 15:00:07.946 2462-30103/? E/NewLauncher: IconCellShoter : ###### isEnter = true
06-07 15:00:07.946 2462-30103/? E/NewLauncher: IconCellShoter : ###### Launcher isResumed = true
06-07 15:00:07.946 2462-30103/? E/NewLauncher: IconCellShoter : ### getIconCellShot wait 1500 !!

                                           --------- beginning of /dev/log/system

06-07 15:00:07.946 1668-2263/? E/ActivityManager: setAppStartingWindow app stack
06-07 15:00:07.956 2462-2750/? E/NewLauncher: LauncherSmartisanNew : rendertarget mTexId=960
06-07 15:00:07.956 2462-2750/? E/NewLauncher: LauncherSmartisanNew : rendertarget mTexId=961
06-07 15:00:07.956 1668-1709/? E/WindowManager: Adding starting window for com.sunfusheng.sample / Token{423c4f80 ActivityRecord{4247a368 u0 com.sunfusheng.sample/.MainActivity t100}}: null
06-07 15:00:07.966 2462-2750/? E/NewLauncher: IconCellShoter : ### cell name = com.sunfusheng.sample.MainActivity
06-07 15:00:07.966 2462-2750/? E/NewLauncher: IconCellShoter : DEBUG : getIconCellShot gl event run finish [12] ms
06-07 15:00:07.966 2462-30103/? E/NewLauncher: IconCellShoter : ### getIconCellShot out and now, mIconCellShotInfo.valid = true mIconCellShotInfo.cellPos.width = 270 mIconCellShotInfo.cellRec.width = 270 mIconCellShotInfo.shadowRect.width = 270
06-07 15:00:08.006 31116-31116/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sunfusheng.sample, PID: 31116
java.lang.RuntimeException: Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication: java.lang.ClassNotFoundException: Didn't find class "com.android.tools.fd.runtime.BootstrapApplication" on path: DexPathList[[zip file "/data/app/com.sunfusheng.sample-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.sunfusheng.sample-1, /vendor/lib, /system/lib]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:516)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4386)
at android.app.ActivityThread.access$1500(ActivityThread.java:145)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1266)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5094)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.tools.fd.runtime.BootstrapApplication" on path: DexPathList[[zip file "/data/app/com.sunfusheng.sample-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.sunfusheng.sample-1, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at android.app.Instrumentation.newApplication(Instrumentation.java:975)
at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4386) 
at android.app.ActivityThread.access$1500(ActivityThread.java:145) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1266) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5094) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702) 
at dalvik.system.NativeStart.main(Native Method) 
06-07 15:00:08.026 2462-2751/? E/NewLauncher: DatabaseHandler : DEBUG : handleEventRemoveNewFlagByIntent ids size 0

重影问题

首先非常感谢使用到这么好的项目~~我用的是1.3.2 ,还是存在重影的问题。我是首页MainActivity挂载四个Fragment, 采用显示隐藏的方式展示四个Fragment。第一个Fragment 中使用了MarqueeView做一个滚动的通知栏的效果,在切换其它fragment再切换回来时,会出现重影的问题。尝试过你说的解决方案, 即在生命周期中暂停开始,还是未能解决问题。希望能看到这个问题解决的方案,谢谢!

点击事件下标越界

等第二轮播放的时候,点击就会下标越界
AndroidRuntime: FATAL EXCEPTION: main
Process: com.rongxun.QingTianZhu, PID: 23088
java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at com.rongxun.QingTianZhu.Fragment.HomeFragment$3.onItemClick(HomeFragment.java:208)
at com.sunfusheng.marqueeview.MarqueeView$2.onClick(MarqueeView.java:126)
at android.view.View.performClick(View.java:5264)
at android.view.View$PerformClick.run(View.java:21297)
at android.os.Handler.handleCallback(Handler.java:743)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:5621)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)

能支持多条吗

这个只能显示一条数据,能支持多条跑马灯吗,类似于这种
1t v3qsj 9 2 8 u f ky

建议

如果文字超过一行的时候,可以左右滑动!

调用startWithText(“阿萨德法师法是”)就崩溃

Process: com.ycl.chinacarpad, PID: 31325
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.animation.Animation.setAnimationListener(android.view.animation.Animation$AnimationListener)' on a null object reference
at com.sunfusheng.marqueeview.MarqueeView.start(MarqueeView.java:211)
at com.sunfusheng.marqueeview.MarqueeView.startWithFixedWidth(MarqueeView.java:174)
at com.sunfusheng.marqueeview.MarqueeView.access$000(MarqueeView.java:23)
at com.sunfusheng.marqueeview.MarqueeView$1.onGlobalLayout(MarqueeView.java:141)
at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:912)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1997)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1161)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6198)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5280)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:963)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758)

Please set the width of MarqueeView ! 这是什么原因导致的,需要指定一个宽度吗

java.lang.RuntimeException: Please set the width of MarqueeView !
at com.sunfusheng.marqueeview.MarqueeView.startWithFixedWidth(MarqueeView.java:155)
at com.sunfusheng.marqueeview.MarqueeView.access$000(MarqueeView.java:23)
at com.sunfusheng.marqueeview.MarqueeView$1.onGlobalLayout(MarqueeView.java:141)
at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:912)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2001)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6064)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:860)
at android.view.Choreographer.doCallbacks(Choreographer.java:672)
at android.view.Choreographer.doFrame(Choreographer.java:608)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:846)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5567)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:742)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:632)

数据为1条时,直接崩溃,改一下 if (notices.size() >= 1) 就OK了

if (notices.size() > 1) { 换成 if (notices.size() >= 1) { 就OK了

private boolean start(@AnimRes int inAnimResId, @AnimRes int outAnimResID) {
removeAllViews();
clearAnimation();

    position = 0;
    addView(createTextView(notices.get(position)));

    if (notices.size() > 1) {
        setInAndOutAnimation(inAnimResId, outAnimResID);
        startFlipping();
    }

java.lang.NullPointerException getInAnimation().setAnimationListener

08-24 12:16:51.943 29855-29855/com.echo.launcher E/AndroidRuntime: FATAL EXCEPTION: main Process: com.echo.launcher, PID: 29855 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.animation.Animation.setAnimationListener(android.view.animation.Animation$AnimationListener)' on a null object reference at com.sunfusheng.marqueeview.MarqueeView.start(MarqueeView.java:211) at com.sunfusheng.marqueeview.MarqueeView.startWithFixedWidth(MarqueeView.java:174) at com.sunfusheng.marqueeview.MarqueeView.access$000(MarqueeView.java:23) at com.sunfusheng.marqueeview.MarqueeView$1.onGlobalLayout(MarqueeView.java:141) at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:912) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1977) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6023) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:606) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5422) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

创建的对象太多,能否销毁已经滚出屏幕的对象

非常感谢让我了解到了跑马灯的这种实现方式.但是对于这种方式,我有个疑虑就是,如果集合数据很多,那么就会创建很多的TextView.所以能不能再每个动画结束时将对应的TextView置为null,便于回收,减少内存开销.

改善

调用 startWithList 会导致先变空白,然后再开始动画
其实是因为调用了 startFlipping

更好的处理方式是
marqueeView.showNext();
marqueeView.startFlipping();

无法单行满行显示

device-2017-07-28-100127
宽度是match_parent,文字也足够长,但是没有顶到右侧边缘,留了一部分空白。应该是填充整行的吧。

Error:(4) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.

集成的时候出装错了,貌似是跟属性冲突?
E:\C_Workspace\PointHelp\app\build\intermediates\res\merged\debug\values-v23\values-v23.xml

Error:(4) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.

Error:(33) Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.Button.Colored'.

compileSdkVersion 22
buildToolsVersion "22.0.1"
minSdkVersion 19
targetSdkVersion 22

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.