Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
# Conflicts:
#	marqueelibrary/build.gradle
#	marqueelibrary/src/main/java/com/gongwen/marqueen/MarqueeFactory.java
  • Loading branch information
gongwen committed Jan 9, 2018
2 parents 3511bb5 + f2923ce commit 405b6ef
Show file tree
Hide file tree
Showing 14 changed files with 244 additions and 138 deletions.
46 changes: 33 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
# MarqueeViewLibrary
跑马灯View,支持自定义跑马灯ItemView。
一个很方便使用和扩展的跑马灯Library,通过提供不同的MarqueeFactory来定制不同的跑马灯View,
并且提供了常用类型的跑马灯效果:SimpleMarqueeView

效果图
---

## 效果图
<img src="/screenshot/screen_shot.gif"/>

示例Apk下载
---
[示例Apk下载](https://github.com/gongwen/MarqueeViewLibrary/raw/master/sample-apk/app-debug-1.1.3.apk)

## 使用

### Gradle:
compile 'com.gongwen:marqueelibrary:1.1.2'
compile 'com.gongwen:marqueelibrary:1.1.3'

### 属性
MarqueeView属性
Expand All @@ -28,8 +35,10 @@ SimpleMarqueeView属性(支持MarqueeView所有属性及以下属性)
| smvTextSize | 文字大小 |
| smvTextColor | 文字颜色 |
| smvTextGravity | 文字位置 |
| smvTextSingleLine | 文字是否单行显示 |
| smvTextEllipsize | 文字显示不下时,系统的处理方式(可选:none,start,middle,end) |

### 用法一:使用SimpleMarqueeView和SimpleMF
### 常见用法:使用SimpleMarqueeView和SimpleMF

#### XML
```
Expand All @@ -42,36 +51,44 @@ SimpleMarqueeView属性(支持MarqueeView所有属性及以下属性)
android:outAnimation="@anim/out_left"
app:marqueeAnimDuration="2000"
app:smvTextColor="@color/white"
app:smvTextEllipsize="end"
app:smvTextGravity="center_vertical"
app:smvTextSize="15sp"></com.gongwen.marqueen.SimpleMarqueeView>
app:smvTextSingleLine="true"
app:smvTextSize="15sp" />
```

#### 设置数据
```
SimpleMarqueeView marqueeView = (SimpleMarqueeView) findViewById(R.id.marqueeView);
final List<String> datas = Arrays.asList("《赋得古原草送别》", "离离原上草,一岁一枯荣。", "野火烧不尽,春风吹又生。", "远芳侵古道,晴翠接荒城。", "又送王孙去,萋萋满别情。");
//SimpleMarqueeView<T>,SimpleMF<T>:泛型T指定其填充的数据类型,比如String,Spanned等
SimpleMarqueeView<String> marqueeView = (SimpleMarqueeView) findViewById(R.id.marqueeView);
SimpleMF<String> marqueeFactory = new SimpleMF(this);
marqueeFactory.setData(datas);
marqueeView.setMarqueeFactory(marqueeFactory);
marqueeView.startFlipping();
```

#### 设置事件监听
#### 设置监听事件
```
marqueeFactory.setOnItemClickListener(new MarqueeFactory.OnItemClickListener<TextView, String>() {
marqueeView.setOnItemClickListener(new OnItemClickListener<TextView, String>() {
@Override
public void onItemClickListener(MarqueeFactory.ViewHolder<TextView, String> holder) {
Toast.makeText(MainActivity.this, holder.data, Toast.LENGTH_SHORT).show();
public void onItemClickListener(TextView mView, String mData, int mPosition) {
/**
* 注意:
* 当MarqueeView有子View时,mView:当前显示的子View,mData:mView所填充的数据,mPosition:mView的索引
* 当MarqueeView无子View时,mView:null,mData:null,mPosition:-1
*/
Toast.makeText(MainActivity.this, String.format("mPosition:%s,mData:%s,mView:%s,.", mPosition, mData, mView), Toast.LENGTH_SHORT).show();
}
});
```

### 用法二:自定义MarqueeFactory来设置不同类型ItemView
### 扩展用法:自定义MarqueeFactory来定制任意类型ItemView

#### XML
```
<com.gongwen.marqueen.MarqueeView
android:id="@+id/marqueeView4"
android:id="@+id/marqueeView"
android:layout_width="match_parent"
android:layout_height="40dp"
android:flipInterval="2500"
Expand All @@ -85,6 +102,9 @@ marqueeFactory.setOnItemClickListener(new MarqueeFactory.OnItemClickListener<Tex
继承自MarqueeFactory,通过泛型指定ItemView类型以及ItemData类型,之后实现generateMarqueeItemView方法,提供ItemView,并为ItemView设置数据即可。
##### 例如:
```
//MarqueeFactory<T extends View, E>
//泛型T:指定ItemView的类型
//泛型E:指定ItemView填充的数据类型
public class ComplexViewMF extends MarqueeFactory<RelativeLayout, ComplexItemEntity> {
private LayoutInflater inflater;
Expand All @@ -103,7 +123,7 @@ public class ComplexViewMF extends MarqueeFactory<RelativeLayout, ComplexItemEnt
}
}
```
#### 设置数据和事件监听用法同上
#### 设置数据和监听事件用法同上

#### 重影问题可参考以下解决方案(参考自[这里](https://github.com/sfsheng0322/MarqueeView))

Expand Down
20 changes: 10 additions & 10 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.gw.marquee"
minSdkVersion 14
targetSdkVersion 25
versionCode 1
versionName "1.0"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
Expand All @@ -24,11 +24,11 @@ dependencies {
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
compile "com.android.support:appcompat-v7:$supportLibraryVersion"
compile "com.android.support:design:$supportLibraryVersion"
testCompile 'junit:junit:4.12'
//compile project(':marqueelibrary')
compile 'com.gongwen:marqueelibrary:1.1.2'
compile project(':marqueelibrary')
//compile 'com.gongwen:marqueelibrary:1.1.3'

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
Expand Down
72 changes: 31 additions & 41 deletions app/src/main/java/com/gw/marquee/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,31 +14,33 @@
import com.gongwen.marqueen.MarqueeView;
import com.gongwen.marqueen.SimpleMF;
import com.gongwen.marqueen.SimpleMarqueeView;
import com.gongwen.marqueen.util.OnItemClickListener;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class MainActivity extends AppCompatActivity {
private final List<String> datas = Arrays.asList("《赋得古原草送别》", "离离原上草,一岁一枯荣。", "野火烧不尽,春风吹又生。", "远芳侵古道,晴翠接荒城。", "又送王孙去,萋萋满别情。");
private SimpleMarqueeView marqueeView1, marqueeView2, marqueeView3, marqueeView5, marqueeView6;
private final List<String> datas = Arrays.asList("《赋得古原草送别》", "离离原上草,一岁一枯荣。", "野火烧不尽,春风吹又生。", "远芳侵古道,晴翠接荒城。", "又送王孙去,萋萋满别情。", "测试测试测试测试测试测试测试测试测试测试测试");
private SimpleMarqueeView<String> marqueeView1, marqueeView2, marqueeView5, marqueeView6;
private SimpleMarqueeView<Spanned> marqueeView3;
private ImageView yellowSpeaker;
private MarqueeView marqueeView4;
private MarqueeView<RelativeLayout, ComplexItemEntity> marqueeView4;

private WeakHandler mHandler = new WeakHandler();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
marqueeView1 = (SimpleMarqueeView) findViewById(R.id.marqueeView1);
marqueeView2 = (SimpleMarqueeView) findViewById(R.id.marqueeView2);
marqueeView3 = (SimpleMarqueeView) findViewById(R.id.marqueeView3);
yellowSpeaker = (ImageView) findViewById(R.id.yellowSpeaker);
marqueeView4 = (MarqueeView) findViewById(R.id.marqueeView4);
marqueeView5 = (SimpleMarqueeView) findViewById(R.id.marqueeView5);
marqueeView6 = (SimpleMarqueeView) findViewById(R.id.marqueeView6);
marqueeView1 = findViewById(R.id.marqueeView1);
marqueeView2 = findViewById(R.id.marqueeView2);
marqueeView3 = findViewById(R.id.marqueeView3);
yellowSpeaker = findViewById(R.id.yellowSpeaker);
marqueeView4 = findViewById(R.id.marqueeView4);
marqueeView5 = findViewById(R.id.marqueeView5);
marqueeView6 = findViewById(R.id.marqueeView6);
DrawableCompat.setTint(DrawableCompat.wrap(yellowSpeaker.getDrawable().mutate()), getResources().getColor(R.color.yellow));

initMarqueeView1();
Expand All @@ -54,25 +56,15 @@ private void initMarqueeView1() {
marqueeFactory.setData(datas);
marqueeView1.setMarqueeFactory(marqueeFactory);
marqueeView1.startFlipping();
marqueeFactory.setOnItemClickListener(new MarqueeFactory.OnItemClickListener<TextView, String>() {
@Override
public void onItemClickListener(MarqueeFactory.ViewHolder<TextView, String> holder) {
Toast.makeText(MainActivity.this, holder.data, Toast.LENGTH_SHORT).show();
}
});
marqueeView1.setOnItemClickListener(onSimpleItemClickListener);
}

private void initMarqueeView2() {
SimpleMF<String> marqueeFactory2 = new SimpleMF(MainActivity.this);
marqueeFactory2.setData(datas);
marqueeView2.setMarqueeFactory(marqueeFactory2);
marqueeView2.startFlipping();
marqueeFactory2.setOnItemClickListener(new MarqueeFactory.OnItemClickListener<TextView, String>() {
@Override
public void onItemClickListener(MarqueeFactory.ViewHolder<TextView, String> holder) {
Toast.makeText(MainActivity.this, holder.data, Toast.LENGTH_SHORT).show();
}
});
marqueeView2.setOnItemClickListener(onSimpleItemClickListener);
}

private void initMarqueeView3() {
Expand All @@ -86,10 +78,10 @@ private void initMarqueeView3() {
marqueeFactory3.setData(datas3);
marqueeView3.setMarqueeFactory(marqueeFactory3);
marqueeView3.startFlipping();
marqueeFactory3.setOnItemClickListener(new MarqueeFactory.OnItemClickListener<TextView, Spanned>() {
marqueeView3.setOnItemClickListener(new OnItemClickListener<TextView, Spanned>() {
@Override
public void onItemClickListener(MarqueeFactory.ViewHolder<TextView, Spanned> holder) {
Toast.makeText(MainActivity.this, holder.data, Toast.LENGTH_SHORT).show();
public void onItemClickListener(TextView mView, Spanned mData, int mPosition) {
Toast.makeText(MainActivity.this, String.format("mPosition:%s,mData:%s,mView:%s,.", mPosition, mData, mView), Toast.LENGTH_SHORT).show();
}
});
}
Expand All @@ -100,40 +92,31 @@ private void initMarqueeView4() {
complexDatas.add(new ComplexItemEntity("标题 " + i, "副标题 " + i, "时间 " + i));
}
MarqueeFactory<RelativeLayout, ComplexItemEntity> marqueeFactory = new ComplexViewMF(MainActivity.this);
marqueeFactory.setOnItemClickListener(new MarqueeFactory.OnItemClickListener<RelativeLayout, ComplexItemEntity>() {

marqueeFactory.setData(complexDatas);
marqueeView4.setOnItemClickListener(new OnItemClickListener<RelativeLayout, ComplexItemEntity>() {
@Override
public void onItemClickListener(MarqueeFactory.ViewHolder<RelativeLayout, ComplexItemEntity> holder) {
Toast.makeText(MainActivity.this, holder.data.toString(), Toast.LENGTH_SHORT).show();
public void onItemClickListener(RelativeLayout mView, ComplexItemEntity mData, int mPosition) {
Toast.makeText(MainActivity.this, String.format("mPosition:%s,mData:%s,mView:%s,.", mPosition, mData, mView), Toast.LENGTH_SHORT).show();
}
});
marqueeFactory.setData(complexDatas);
marqueeView4.setInAndOutAnim(R.anim.in_top, R.anim.out_bottom);
marqueeView4.setMarqueeFactory(marqueeFactory);
marqueeView4.startFlipping();
}

private void initMarqueeView5() {
SimpleMF<String> marqueeFactory = new SimpleMF(this);
marqueeFactory.setOnItemClickListener(new MarqueeFactory.OnItemClickListener<TextView, String>() {
@Override
public void onItemClickListener(MarqueeFactory.ViewHolder<TextView, String> holder) {
Toast.makeText(MainActivity.this, holder.data, Toast.LENGTH_SHORT).show();
}
});
marqueeFactory.setData(datas);
marqueeView5.setOnItemClickListener(onSimpleItemClickListener);
marqueeView5.setMarqueeFactory(marqueeFactory);
marqueeView5.startFlipping();
}

private void initMarqueeView6() {
final SimpleMF<String> marqueeFactory = new SimpleMF<>(this);
marqueeFactory.setOnItemClickListener(new MarqueeFactory.OnItemClickListener<TextView, String>() {
@Override
public void onItemClickListener(MarqueeFactory.ViewHolder<TextView, String> holder) {
Toast.makeText(MainActivity.this, holder.data, Toast.LENGTH_SHORT).show();
}
});
marqueeFactory.setData(datas);
marqueeView6.setOnItemClickListener(onSimpleItemClickListener);
marqueeView6.setMarqueeFactory(marqueeFactory);
marqueeView6.startFlipping();

Expand Down Expand Up @@ -164,4 +147,11 @@ public void onStop() {
marqueeView2.stopFlipping();
marqueeView3.stopFlipping();
}

private OnItemClickListener<TextView, String> onSimpleItemClickListener = new OnItemClickListener<TextView, String>() {
@Override
public void onItemClickListener(TextView mView, String mData, int mPosition) {
Toast.makeText(MainActivity.this, String.format("mPosition:%s,mData:%s,mView:%s,.", mPosition, mData, mView), Toast.LENGTH_SHORT).show();
}
};
}
3 changes: 3 additions & 0 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@
android:layout_height="match_parent"
android:layout_weight="1"
app:smvTextColor="@color/white"
app:smvTextEllipsize="end"
app:smvTextGravity="center_vertical"
app:smvTextSingleLine="true"
app:smvTextSize="15sp"></com.gongwen.marqueen.SimpleMarqueeView>

</LinearLayout>
Expand Down Expand Up @@ -151,6 +153,7 @@
app:smvTextGravity="center_vertical"
app:smvTextSize="15sp"></com.gongwen.marqueen.SimpleMarqueeView>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
Expand Down
16 changes: 13 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,30 @@

buildscript {
repositories {
google()
jcenter()
//maven { url 'https://dl.bintray.com/gongwen92/maven' }
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.android.tools.build:gradle:3.0.1'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.novoda:bintray-release:0.5.0'
classpath 'com.novoda:bintray-release:0.8.0'
}
}
ext {

compileSdkVersion = 27
buildToolsVersion = '27.0.3'
minSdkVersion = 14
targetSdkVersion = 27
supportLibraryVersion = '27.0.2'
versionCode = 113
versionName = "1.1.3"
}
allprojects {
repositories {
google()
jcenter()
}
}
Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Mon Dec 28 10:00:20 PST 2015
#Mon Jan 08 13:50:05 CST 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
18 changes: 8 additions & 10 deletions marqueelibrary/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,16 @@ apply plugin: 'com.android.library'
apply plugin: 'com.novoda.bintray-release'

android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion

defaultConfig {

minSdkVersion 14
targetSdkVersion 25
versionCode 111
versionName "1.1.1"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}
buildTypes {
release {
Expand All @@ -28,15 +26,15 @@ dependencies {
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile "com.android.support:appcompat-v7:$supportLibraryVersion"
testCompile 'junit:junit:4.12'
}

publish {
userOrg = 'gongwen92' //bintray注册的用户名
groupId = 'com.gongwen' //compile引用时的第1部分groupId
artifactId = 'marqueelibrary' //compile引用时的第2部分项目名
publishVersion = '1.1.2' //compile引用时的第3部分版本号
publishVersion = rootProject.ext.versionName //compile引用时的第3部分版本号
desc = 'This is the marqueeview library'
website = 'https://github.com/gongwen/MarqueeViewDemo'
}
Loading

0 comments on commit 405b6ef

Please sign in to comment.