├── .gitignore ├── .idea ├── caches │ └── build_file_checksums.ser ├── codeStyles │ └── Project.xml ├── gradle.xml ├── misc.xml └── runConfigurations.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── libs │ └── exo-2.0.4.jar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── dawn │ │ └── bannerimageandvideo │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── danmu.json │ │ └── tv.txt │ ├── java │ │ └── com │ │ │ └── dawn │ │ │ └── bannerimageandvideo │ │ │ ├── BannerActivity.java │ │ │ ├── EightActivity.java │ │ │ ├── FiveActivity.java │ │ │ ├── FourActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── SevenActivity.java │ │ │ ├── SharePreferenceSaveListActivity.java │ │ │ ├── SixActivity.java │ │ │ ├── ThreeActivity.java │ │ │ ├── TwoActivity.java │ │ │ ├── adapter │ │ │ ├── BannerAdapter.java │ │ │ ├── BannerViewAdapter.java │ │ │ └── MyPagerAdapter.java │ │ │ ├── bean │ │ │ └── BannerModel.java │ │ │ ├── model │ │ │ └── Userbean.java │ │ │ ├── qsvideo │ │ │ ├── RecyVideoActivity.java │ │ │ ├── danmaku │ │ │ │ ├── DanmakuConfig.java │ │ │ │ ├── DanmakuControl.java │ │ │ │ └── QSDanmakuParser.java │ │ │ ├── io │ │ │ │ ├── FileUtil.java │ │ │ │ ├── IProgress.java │ │ │ │ ├── ReadHelp.java │ │ │ │ └── WriteHelp.java │ │ │ ├── listvideo │ │ │ │ ├── CallBack.java │ │ │ │ ├── Getter.java │ │ │ │ ├── ListCalculator.java │ │ │ │ ├── ListViewGetter.java │ │ │ │ └── RecyclerViewGetter.java │ │ │ └── media │ │ │ │ └── ExoMedia.java │ │ │ ├── utils │ │ │ └── ListDataSave.java │ │ │ └── widget │ │ │ └── MyListView.java │ └── res │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ ├── radiu_blue.xml │ │ ├── radiu_gray.xml │ │ ├── red_dot.png │ │ └── red_dot_night.png │ │ ├── layout │ │ ├── activity_banner.xml │ │ ├── activity_eight.xml │ │ ├── activity_five.xml │ │ ├── activity_four.xml │ │ ├── activity_main.xml │ │ ├── activity_recy_video.xml │ │ ├── activity_seven.xml │ │ ├── activity_share_preference_save_list.xml │ │ ├── activity_three.xml │ │ ├── activity_two.xml │ │ └── item_video.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── cover.jpg │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── dawn │ └── bannerimageandvideo │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── images ├── one.png ├── three.png └── two.png ├── nicevideoplayer ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── dawn │ │ └── nicevideoplayer │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── dawn │ │ │ └── nicevideoplayer │ │ │ ├── ChangeClarityDialog.java │ │ │ ├── Clarity.java │ │ │ ├── INiceVideoPlayer.java │ │ │ ├── LogUtil.java │ │ │ ├── NiceTextureView.java │ │ │ ├── NiceUtil.java │ │ │ ├── NiceVideoPlayer.java │ │ │ ├── NiceVideoPlayerController.java │ │ │ ├── NiceVideoPlayerManager.java │ │ │ └── TxVideoPlayerController.java │ └── res │ │ ├── color │ │ └── select_change_clarity_color.xml │ │ ├── drawable-xhdpi │ │ ├── battery_10.png │ │ ├── battery_100.png │ │ ├── battery_20.png │ │ ├── battery_50.png │ │ ├── battery_80.png │ │ ├── battery_charging.png │ │ ├── battery_full.png │ │ ├── ic_palyer_brightness.png │ │ ├── ic_palyer_share.png │ │ ├── ic_palyer_volume.png │ │ ├── ic_player_back.png │ │ ├── ic_player_center_start.png │ │ ├── ic_player_enlarge.png │ │ ├── ic_player_pause.png │ │ ├── ic_player_replay.png │ │ ├── ic_player_shrink.png │ │ ├── ic_player_start.png │ │ ├── img_default.png │ │ ├── loading00.png │ │ ├── loading01.png │ │ ├── loading02.png │ │ ├── loading03.png │ │ ├── loading04.png │ │ ├── loading05.png │ │ ├── loading06.png │ │ ├── loading07.png │ │ ├── loading08.png │ │ ├── loading09.png │ │ ├── loading10.png │ │ ├── loading11.png │ │ ├── loading12.png │ │ ├── loading13.png │ │ ├── loading14.png │ │ ├── loading15.png │ │ ├── loading16.png │ │ ├── loading17.png │ │ ├── loading18.png │ │ ├── loading19.png │ │ ├── loading20.png │ │ ├── loading21.png │ │ ├── loading22.png │ │ ├── loading23.png │ │ ├── loading24.png │ │ ├── loading25.png │ │ ├── loading26.png │ │ ├── loading27.png │ │ ├── loading28.png │ │ ├── loading29.png │ │ ├── player_mask_bottom.png │ │ └── player_mask_top.png │ │ ├── drawable │ │ ├── bg_change_clarity_checked.xml │ │ ├── bg_change_clarity_normal.xml │ │ ├── bg_radius_4.xml │ │ ├── bg_retry.xml │ │ ├── loading.xml │ │ ├── pb_change.xml │ │ ├── seek_progress.xml │ │ ├── seek_thumb.xml │ │ ├── seek_thumb_normal.xml │ │ ├── seek_thumb_pressed.xml │ │ └── select_change_clarity.xml │ │ ├── layout │ │ ├── item_change_clarity.xml │ │ └── tx_video_palyer_controller.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── dawn │ └── nicevideoplayer │ └── ExampleUnitTest.java ├── qsvideoplayer ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── dawn │ │ └── qsvideoplayer │ │ ├── ConfigManage.java │ │ ├── DemoQSVideoView.java │ │ ├── HandlePlayListener.java │ │ ├── HandleTouchEvent.java │ │ ├── IVideoPlayer.java │ │ ├── PlayListener.java │ │ ├── QSVideoView.java │ │ ├── QSVideoViewHelp.java │ │ ├── Util.java │ │ ├── floatwindow │ │ ├── FloatMoveView.java │ │ ├── FloatParams.java │ │ ├── FloatWindowHelp.java │ │ ├── TextureVideoViewOutlineProvider.java │ │ └── WindowManage.java │ │ ├── media │ │ ├── AndroidMedia.java │ │ ├── BaseMedia.java │ │ ├── IMediaCallback.java │ │ ├── IMediaControl.java │ │ ├── IjkBaseMedia.java │ │ ├── IjkExoMedia.java │ │ └── IjkMedia.java │ │ └── rederview │ │ ├── IRenderView.java │ │ ├── MeasureHelper.java │ │ ├── SufaceRenderView.java │ │ └── TextureRenderView.java │ └── res │ ├── drawable-xhdpi │ ├── jc_back.png │ ├── jc_back_tiny_normal.png │ ├── jc_back_tiny_pressed.png │ ├── jc_backward_icon.png │ ├── jc_brightness_video.png │ ├── jc_enlarge.png │ ├── jc_error_normal.png │ ├── jc_error_pressed.png │ ├── jc_forward_icon.png │ ├── jc_loading_bg.png │ ├── jc_pause_normal.png │ ├── jc_pause_pressed.png │ ├── jc_play_normal.png │ ├── jc_play_pressed.png │ ├── jc_shrink.png │ ├── jc_volume_icon.png │ └── qs_goback.png │ ├── drawable-xxhdpi │ ├── mute_black.png │ └── voice_black.png │ ├── drawable │ ├── bottom_backgroud.xml │ ├── jc_click_back_tiny_selector.xml │ ├── jc_click_error_selector.xml │ ├── jc_click_pause_selector.xml │ ├── jc_click_play_selector.xml │ ├── jc_dialog_progress.xml │ ├── jc_dialog_progress_bg.xml │ ├── jc_loading.xml │ ├── jc_progress.xml │ ├── jc_seek_progress.xml │ ├── jc_seek_thumb.xml │ ├── jc_seek_thumb_normal.xml │ ├── jc_seek_thumb_pressed.xml │ ├── jc_volume_progress_bg.xml │ └── top_backgroud.xml │ ├── layout │ ├── jc_dialog_brightness.xml │ ├── jc_dialog_progress.xml │ ├── jc_dialog_volume.xml │ └── video_view.xml │ ├── values-pt │ └── strings.xml │ ├── values-tr │ └── strings.xml │ ├── values-zh │ └── strings.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── ids.xml │ ├── strings.xml │ └── styles.xml ├── settings.gradle └── videoplayerlibrary ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src ├── androidTest └── java │ └── com │ └── dawn │ └── videoplayerlibrary │ └── ExampleInstrumentedTest.java ├── main ├── AndroidManifest.xml ├── java │ └── com │ │ └── dawn │ │ └── videoplayerlibrary │ │ ├── CustomView │ │ ├── JZVideoPlayerStandardAutoCompleteAfterFullscreen.java │ │ ├── JZVideoPlayerStandardFresco.java │ │ ├── JZVideoPlayerStandardShowShareButtonAfterFullscreen.java │ │ ├── JZVideoPlayerStandardShowTextureViewAfterAutoComplete.java │ │ ├── JZVideoPlayerStandardShowTitleAfterFullscreen.java │ │ ├── JZVideoPlayerStandardVolumeAfterFullscreen.java │ │ └── MyJZVideoPlayerStandard.java │ │ ├── JZMediaInterface.java │ │ ├── JZMediaManager.java │ │ ├── JZMediaSystem.java │ │ ├── JZResizeTextureView.java │ │ ├── JZUserAction.java │ │ ├── JZUserActionStandard.java │ │ ├── JZUtils.java │ │ ├── JZVideoPlayer.java │ │ ├── JZVideoPlayerManager.java │ │ └── JZVideoPlayerStandard.java └── res │ ├── anim │ ├── quit_fullscreen.xml │ └── start_fullscreen.xml │ ├── drawable-xhdpi │ ├── jz_add_volume.png │ ├── jz_back_normal.png │ ├── jz_back_pressed.png │ ├── jz_back_tiny_normal.png │ ├── jz_back_tiny_pressed.png │ ├── jz_backward_icon.png │ ├── jz_battery_level_10.png │ ├── jz_battery_level_100.png │ ├── jz_battery_level_30.png │ ├── jz_battery_level_50.png │ ├── jz_battery_level_70.png │ ├── jz_battery_level_90.png │ ├── jz_brightness_video.png │ ├── jz_clarity_popwindow_bg.9.png │ ├── jz_close_volume.png │ ├── jz_enlarge.png │ ├── jz_forward_icon.png │ ├── jz_loading_bg.png │ ├── jz_pause_normal.png │ ├── jz_pause_pressed.png │ ├── jz_play_normal.png │ ├── jz_play_pressed.png │ ├── jz_restart_normal.png │ ├── jz_restart_pressed.png │ ├── jz_share_normal.png │ ├── jz_share_pressed.png │ ├── jz_shrink.png │ └── jz_volume_icon.png │ ├── drawable-xxhdpi │ └── jz_clarity_popwindow_bg.9.png │ ├── drawable │ ├── jz_bottom_bg.9.png │ ├── jz_bottom_progress.xml │ ├── jz_bottom_seek_progress.xml │ ├── jz_bottom_seek_thumb.xml │ ├── jz_click_back_selector.xml │ ├── jz_click_back_tiny_selector.xml │ ├── jz_click_pause_selector.xml │ ├── jz_click_play_selector.xml │ ├── jz_click_replay_selector.xml │ ├── jz_click_share_selector.xml │ ├── jz_dialog_progress.xml │ ├── jz_dialog_progress_bg.xml │ ├── jz_loading.xml │ ├── jz_seek_thumb_normal.xml │ ├── jz_seek_thumb_pressed.xml │ ├── jz_title_bg.9.png │ ├── jz_volume_progress_bg.xml │ ├── retry_bg.xml │ └── share_selector.xml │ ├── layout │ ├── jz_dialog_brightness.xml │ ├── jz_dialog_progress.xml │ ├── jz_dialog_volume.xml │ ├── jz_layout_clarity.xml │ ├── jz_layout_clarity_item.xml │ ├── jz_layout_standard.xml │ ├── layout_standard_fresco.xml │ └── layout_standard_with_share_button.xml │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── share_normal.png │ └── share_pressed.png │ ├── values-es │ └── strings.xml │ ├── values-pt │ └── strings.xml │ ├── values-tr │ └── strings.xml │ ├── values-zh │ └── strings.xml │ └── values │ ├── dimens.xml │ ├── ids.xml │ ├── strings.xml │ └── styles.xml └── test └── java └── com └── dawn └── videoplayerlibrary └── ExampleUnitTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/libraries 5 | /.idea/modules.xml 6 | /.idea/workspace.xml 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /.idea/caches/build_file_checksums.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DawenZeng/BannerImageAndVideo/6aa42e59fd8d7aa1e4799c3cad9fd757c8aa8f5d/.idea/caches/build_file_checksums.ser -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 15 | 16 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BannerImageAndVideo 2 | 图片和视频左右滑动切换混播,添加导航点,视频添加静音;这里有多种图片和视频左右滑动切换方法,有多种添加导航点,多种控制视频静音的方法。 3 | 下面是一些功能的截取图片: 4 | 5 | ![image](https://github.com/DawenZeng/BannerImageAndVideo/blob/master/images/one.png) 6 | ![image](https://github.com/DawenZeng/BannerImageAndVideo/blob/master/images/two.png) 7 | ![image](https://github.com/DawenZeng/BannerImageAndVideo/blob/master/images/three.png) 8 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 27 5 | defaultConfig { 6 | applicationId "com.dawn.bannerimageandvideo" 7 | minSdkVersion 16 8 | targetSdkVersion 27 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | implementation fileTree(include: ['*.jar'], dir: 'libs') 24 | implementation 'com.android.support:appcompat-v7:27.1.1' 25 | implementation 'com.android.support.constraint:constraint-layout:1.1.0' 26 | testImplementation 'junit:junit:4.12' 27 | implementation 'com.github.bumptech.glide:glide:3.7.0' 28 | implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' 29 | // // 饺子视频播放器 30 | // implementation 'cn.jzvd:jiaozivideoplayer:6.2.7' 31 | implementation project(':videoplayerlibrary') 32 | implementation project(':nicevideoplayer') 33 | //start**************用于qsvideoplayer的视频播放*************end 34 | implementation project(':qsvideoplayer') 35 | implementation 'com.android.support:recyclerview-v7:27.1.1' 36 | implementation 'com.github.ctiao:DanmakuFlameMaster:0.9.25' 37 | //弹幕 38 | implementation 'com.github.ctiao:ndkbitmap-armv7a:0.9.21' 39 | implementation files('libs/exo-2.0.4.jar') 40 | //end***********用于qsvideoplayer的视频播放*****************end 41 | 42 | implementation 'com.google.code.gson:gson:2.8.2' 43 | } 44 | -------------------------------------------------------------------------------- /app/libs/exo-2.0.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DawenZeng/BannerImageAndVideo/6aa42e59fd8d7aa1e4799c3cad9fd757c8aa8f5d/app/libs/exo-2.0.4.jar -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/dawn/bannerimageandvideo/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.dawn.bannerimageandvideo", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 32 | 35 | 38 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/assets/tv.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DawenZeng/BannerImageAndVideo/6aa42e59fd8d7aa1e4799c3cad9fd757c8aa8f5d/app/src/main/assets/tv.txt -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/BannerActivity.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.view.ViewPager; 5 | import android.support.v7.app.AppCompatActivity; 6 | 7 | import com.dawn.bannerimageandvideo.adapter.BannerAdapter; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class BannerActivity extends AppCompatActivity { 13 | 14 | 15 | private List bannerList = new ArrayList<>(); 16 | private ViewPager banner; 17 | BannerAdapter bannerAdapter; 18 | 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_banner); 24 | 25 | bannerList = (List) getIntent().getStringArrayListExtra("list"); 26 | banner = findViewById(R.id.banner); 27 | // banner.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 28 | 29 | bannerAdapter = new BannerAdapter(this); 30 | bannerAdapter.update(bannerList); 31 | banner.setAdapter(bannerAdapter); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/FiveActivity.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.view.ViewPager; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.widget.ArrayAdapter; 7 | import android.widget.ImageView; 8 | import android.widget.LinearLayout; 9 | import android.widget.ListView; 10 | 11 | import com.dawn.bannerimageandvideo.adapter.BannerAdapter; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | public class FiveActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { 17 | 18 | private List bannerList = new ArrayList<>(); 19 | private ViewPager banner; 20 | private LinearLayout group; 21 | BannerAdapter bannerAdapter; 22 | private ListView listview; 23 | private String[] presidents = {"北京", "深圳", "济南", "广州", "海南", "香港", "澳门", "aa", "北京", "深圳", "济南", "广州", "海南", "香港", "澳门", "aa", "北京", "深圳", "济南", "广州", "海南", "香港", "澳门", "aa", "北京", "深圳", "济南", "广州", "海南", "香港", "澳门", "aa"}; 24 | 25 | private int mIndicatorSelectedResId = R.drawable.radiu_blue;//蓝色导航点 26 | private int mIndicatorUnselectedResId = R.drawable.radiu_gray;//灰色导航点 27 | /** 28 | * 装点点的ImageView数组 29 | */ 30 | private ImageView[] tips; 31 | 32 | @Override 33 | protected void onCreate(Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | setContentView(R.layout.activity_five); 36 | 37 | bannerList = (List) getIntent().getStringArrayListExtra("list"); 38 | banner = findViewById(R.id.vp_main); 39 | group = findViewById(R.id.ll_main_dot); 40 | listview = findViewById(R.id.list); 41 | // 设置LinearLayout的子控件的宽高,这里单位是像素。 42 | LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(15, 15); 43 | params.rightMargin = 20; 44 | // 将点点加入到ViewGroup中 45 | tips = new ImageView[bannerList.size()]; 46 | for (int i = 0; i < bannerList.size(); i++) { 47 | ImageView imageView = new ImageView(this); 48 | imageView.setLayoutParams(params); 49 | if (i == 0) { 50 | imageView.setImageResource(mIndicatorSelectedResId); 51 | } else { 52 | imageView.setImageResource(mIndicatorUnselectedResId); 53 | } 54 | tips[i] = imageView; 55 | group.addView(imageView); 56 | } 57 | 58 | bannerAdapter = new BannerAdapter(this); 59 | bannerAdapter.update(bannerList); 60 | banner.setAdapter(bannerAdapter); 61 | // 设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动 62 | // viewPager.setCurrentItem((mImageViews.length) * 100); 63 | // 一开始不能往滑,但没有图片是默认图片一开始就显示 64 | banner.setCurrentItem(0); 65 | // 设置监听,主要是设置点点的背景 66 | banner.setOnPageChangeListener(this); 67 | 68 | listview.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, presidents)); 69 | listview.setFocusable(false); 70 | } 71 | 72 | @Override 73 | public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 74 | 75 | } 76 | 77 | @Override 78 | public void onPageSelected(int position) { 79 | setImageBackground(position % bannerList.size()); 80 | } 81 | 82 | @Override 83 | public void onPageScrollStateChanged(int state) { 84 | } 85 | 86 | /** 87 | * 设置选中的tip的背景 88 | * 89 | * @param selectItems 90 | */ 91 | private void setImageBackground(int selectItems) { 92 | for (int i = 0; i < tips.length; i++) { 93 | if (i == selectItems) { 94 | tips[i].setImageResource(mIndicatorSelectedResId); 95 | } else { 96 | tips[i].setImageResource(mIndicatorUnselectedResId); 97 | } 98 | } 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | 8 | import java.util.ArrayList; 9 | 10 | //实现视频+图片轮播 11 | public class MainActivity extends AppCompatActivity { 12 | 13 | private Intent it; 14 | private int index;//获取视频的下标 15 | 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.activity_main); 20 | 21 | ArrayList bannerList = new ArrayList<>(); 22 | bannerList.add("https://erp.vipstation.com.hk/images/itemimg/Q6053406.jpg"); 23 | bannerList.add("https://erp.vipstation.com.hk/upload/image/20160527/20160527150822_4183.jpg"); 24 | bannerList.add("https://erp.vipstation.com.hk/upload/image/20160527/20160527150824_3404.jpg"); 25 | bannerList.add("https://erp.vipstation.com.hk/upload/image/20160527/20160527150825_1275.jpg"); 26 | bannerList.add("https://erp.vipstation.com.hk/images/IC/IC0002851/IC0002851_180419124311770_iOS.mp4"); 27 | // bannerList.add("http://videos.kpie.com.cn/videos/20170526/037DCE54-EECE-4520-AA92-E4002B1F29B0.mp4"); 28 | 29 | for (int i = 0; i < bannerList.size(); i++) { 30 | if (bannerList.get(i).contains(".mp4")) 31 | index = i; 32 | } 33 | bannerList.add(0, bannerList.remove(index));//把视频放在第一个位置 34 | 35 | it = new Intent(); 36 | it.putStringArrayListExtra("list", bannerList); 37 | } 38 | 39 | public void btn1(View view) { 40 | it.setClass(this, BannerActivity.class); 41 | startActivity(it); 42 | } 43 | 44 | public void btn2(View view) { 45 | it.setClass(this, TwoActivity.class); 46 | startActivity(it); 47 | } 48 | 49 | public void btn3(View view) { 50 | it.setClass(this, ThreeActivity.class); 51 | startActivity(it); 52 | } 53 | 54 | public void btn4(View view) { 55 | it.setClass(this, FourActivity.class); 56 | startActivity(it); 57 | } 58 | 59 | public void btn5(View view) { 60 | it.setClass(this, FiveActivity.class); 61 | startActivity(it); 62 | } 63 | 64 | public void btn6(View view) { 65 | it.setClass(this, SixActivity.class); 66 | startActivity(it); 67 | } 68 | 69 | public void btn7(View view) { 70 | it.setClass(this, SevenActivity.class); 71 | startActivity(it); 72 | } 73 | 74 | public void btn8(View view) { 75 | it.setClass(this, EightActivity.class); 76 | startActivity(it); 77 | } 78 | 79 | public void btn9(View view) { 80 | it.setClass(this, SharePreferenceSaveListActivity.class); 81 | startActivity(it); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/SharePreferenceSaveListActivity.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | import android.widget.Toast; 8 | 9 | import com.dawn.bannerimageandvideo.model.Userbean; 10 | import com.dawn.bannerimageandvideo.utils.ListDataSave; 11 | 12 | import java.util.ArrayList; 13 | import java.util.HashMap; 14 | import java.util.List; 15 | import java.util.Map; 16 | 17 | public class SharePreferenceSaveListActivity extends AppCompatActivity implements View.OnClickListener { 18 | 19 | Context mContext; 20 | ListDataSave dataSave; 21 | private List listBean; 22 | private ArrayList listString; 23 | private ArrayList> listMap; 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.activity_share_preference_save_list); 29 | initView(); 30 | } 31 | 32 | private void initView() { 33 | findViewById(R.id.btn_addString).setOnClickListener(this); 34 | findViewById(R.id.btn_addJavaBean).setOnClickListener(this); 35 | findViewById(R.id.btn_addMap).setOnClickListener(this); 36 | findViewById(R.id.btn_getString).setOnClickListener(this); 37 | findViewById(R.id.btn_getJavaBean).setOnClickListener(this); 38 | findViewById(R.id.btn_getMap).setOnClickListener(this); 39 | mContext = getApplicationContext(); 40 | dataSave = new ListDataSave(mContext, "baiyu"); 41 | listString = new ArrayList(); 42 | listBean = new ArrayList(); 43 | listMap = new ArrayList>(); 44 | } 45 | 46 | @Override 47 | public void onClick(View v) { 48 | switch (v.getId()) { 49 | case R.id.btn_addString: 50 | String s = "小名"; 51 | listString.add(s); 52 | dataSave.setDataList("string", listString); 53 | 54 | break; 55 | case R.id.btn_getString: 56 | Toast.makeText(mContext, dataSave.getDataList("string").toString(), Toast.LENGTH_SHORT).show(); 57 | break; 58 | case R.id.btn_addJavaBean: 59 | listBean.clear(); 60 | Userbean user = new Userbean(); 61 | user.setName("小白"); 62 | user.setAge(16); 63 | listBean.add(user); 64 | dataSave.setDataList("javaBean", listBean); 65 | break; 66 | case R.id.btn_getJavaBean: 67 | listBean = dataSave.getDataList("javaBean"); 68 | Toast.makeText(mContext, listBean.toString(), Toast.LENGTH_SHORT).show(); 69 | 70 | break; 71 | case R.id.btn_addMap: 72 | Map map = new HashMap(); 73 | map.put("name", "大白"); 74 | map.put("age", 18); 75 | listMap.add(map); 76 | dataSave.setDataList("listMap", listMap); 77 | break; 78 | case R.id.btn_getMap: 79 | Toast.makeText(mContext, dataSave.getDataList("listMap").toString(), Toast.LENGTH_SHORT).show(); 80 | break; 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/ThreeActivity.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo; 2 | 3 | import android.graphics.Bitmap; 4 | import android.media.MediaMetadataRetriever; 5 | import android.os.Build; 6 | import android.os.Bundle; 7 | import android.support.v7.app.AppCompatActivity; 8 | 9 | import com.bumptech.glide.Glide; 10 | import com.dawn.videoplayerlibrary.JZVideoPlayer; 11 | import com.dawn.videoplayerlibrary.JZVideoPlayerStandard; 12 | 13 | import java.io.ByteArrayOutputStream; 14 | import java.util.ArrayList; 15 | import java.util.HashMap; 16 | import java.util.List; 17 | 18 | 19 | public class ThreeActivity extends AppCompatActivity { 20 | 21 | private List bannerList = new ArrayList<>(); 22 | private JZVideoPlayerStandard jcVideo; 23 | 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.activity_three); 29 | bannerList = (List) getIntent().getStringArrayListExtra("list"); 30 | jcVideo = findViewById(R.id.jc_video); 31 | //获取视频第一帧的图片 32 | MediaMetadataRetriever media = new MediaMetadataRetriever(); 33 | if (Build.VERSION.SDK_INT >= 14) { 34 | media.setDataSource(bannerList.get(0), new HashMap()); 35 | } else { 36 | media.setDataSource(bannerList.get(0)); 37 | } 38 | //获取第一帧 39 | Bitmap bitmap = media.getFrameAtTime(1, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); 40 | media.release(); 41 | //用于Glide可以加载Bitmap图片 42 | ByteArrayOutputStream baos = new ByteArrayOutputStream(); 43 | bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 44 | byte[] bytes = baos.toByteArray(); 45 | 46 | jcVideo.setUp(bannerList.get(0), JZVideoPlayerStandard.SCREEN_WINDOW_NORMAL, ""); 47 | // Glide.with(this).load("http://jzvd-pic.nathen.cn/jzvd-pic/1bb2ebbe-140d-4e2e-abd2-9e7e564f71ac.png").into(myJZVideoPlayerStandard.thumbImageView); 48 | Glide.with(this).load(bytes).into(jcVideo.thumbImageView); 49 | // JZVideoPlayer.setJzUserAction(null); 50 | } 51 | 52 | @Override 53 | protected void onPause() { 54 | super.onPause(); 55 | // JZVideoPlayer.setJzUserAction(null); 56 | JZVideoPlayer.releaseAllVideos(); 57 | // JZVideoPlayerStandard.setOnClickFullScreenListener(null); 58 | JZVideoPlayerStandard.releaseAllVideos(); 59 | } 60 | 61 | @Override 62 | public void onBackPressed() { 63 | if (JZVideoPlayer.backPress()) { 64 | return; 65 | } 66 | super.onBackPressed(); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/adapter/BannerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.adapter; 2 | 3 | import android.content.Context; 4 | import android.support.v4.view.PagerAdapter; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.ImageView; 8 | import android.widget.Toast; 9 | 10 | import com.bumptech.glide.Glide; 11 | import com.dawn.videoplayerlibrary.JZVideoPlayerStandard; 12 | 13 | import java.util.List; 14 | 15 | public class BannerAdapter extends PagerAdapter { 16 | private Context mContext; 17 | private List imgUrls; 18 | // private BannerListener bannerListener; 19 | 20 | public BannerAdapter(Context context) { 21 | this.mContext = context; 22 | } 23 | 24 | public void update(List resIds) { 25 | if (this.imgUrls != null) 26 | this.imgUrls.clear(); 27 | if (resIds != null) 28 | this.imgUrls = resIds; 29 | } 30 | 31 | @Override 32 | public int getCount() { 33 | return imgUrls == null ? 0 : Integer.MAX_VALUE; 34 | } 35 | 36 | @Override 37 | public boolean isViewFromObject(View view, Object object) { 38 | return view == object; 39 | } 40 | 41 | @Override 42 | public void destroyItem(ViewGroup container, int position, Object object) { 43 | container.removeView((View) object); 44 | } 45 | 46 | @Override 47 | public Object instantiateItem(ViewGroup container, final int position) { 48 | String url = imgUrls.get(position % imgUrls.size()); 49 | if (!url.contains(".mp4")) { 50 | ImageView imageView = new ImageView(mContext); 51 | imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 52 | // imageView.setScaleType(ImageView.ScaleType.FIT_XY); 53 | Glide.with(mContext).load(url).into(imageView); 54 | container.addView(imageView); 55 | imageView.setOnClickListener(new View.OnClickListener() { 56 | @Override 57 | public void onClick(View v) { 58 | Toast.makeText(mContext, "ssssss", Toast.LENGTH_SHORT).show(); 59 | // bannerListener.bannerClick(position % imgUrls.size()); 60 | } 61 | }); 62 | return imageView; 63 | } else { 64 | // final VideoView videoView = new VideoView(mContext); 65 | // Uri uri = Uri.parse(url); 66 | // videoView.setVideoURI(uri); 67 | // videoView.start(); 68 | JZVideoPlayerStandard jzVideoPlayerStandard = new JZVideoPlayerStandard(mContext); 69 | jzVideoPlayerStandard.setUp(url, JZVideoPlayerStandard.SCREEN_WINDOW_NORMAL, "播放测试"); 70 | // Glide.with(this).load("http://jzvd-pic.nathen.cn/jzvd-pic/1bb2ebbe-140d-4e2e-abd2-9e7e564f71ac.png").into(myJZVideoPlayerStandard.thumbImageView); 71 | Glide.with(mContext).load(imgUrls.get(1)).into(jzVideoPlayerStandard.thumbImageView); 72 | // JZVideoPlayer.setJzUserAction(null); 73 | container.addView(jzVideoPlayerStandard); 74 | // videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 75 | // @Override 76 | // public void onCompletion(MediaPlayer mp) { 77 | //// bannerListener.playEnd(); 78 | // } 79 | // }); 80 | return jzVideoPlayerStandard; 81 | } 82 | } 83 | 84 | // public void setBannerListener(BannerListener bannerListener) { 85 | // this.bannerListener = bannerListener; 86 | // } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/adapter/BannerViewAdapter.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.adapter; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.net.Uri; 6 | import android.support.v4.view.PagerAdapter; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.ImageView; 10 | import android.widget.VideoView; 11 | 12 | import com.bumptech.glide.Glide; 13 | import com.dawn.bannerimageandvideo.bean.BannerModel; 14 | 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | 18 | public class BannerViewAdapter extends PagerAdapter { 19 | private Context context; 20 | private List listBean; 21 | 22 | public BannerViewAdapter(Activity context, List list) { 23 | this.context = context.getApplicationContext(); 24 | if (list == null || list.size() == 0) { 25 | this.listBean = new ArrayList<>(); 26 | } else { 27 | this.listBean = list; 28 | } 29 | } 30 | 31 | @Override 32 | public Object instantiateItem(final ViewGroup container, final int position) { 33 | if (listBean.get(position).getUrlType() == 0) {//图片 34 | final ImageView imageView = new ImageView(context); 35 | Glide.with(context).load(listBean.get(position).getBannerUrl()) 36 | .skipMemoryCache(true) 37 | .into(imageView); 38 | container.addView(imageView); 39 | 40 | return imageView; 41 | } else {//视频 42 | final VideoView videoView = new VideoView(context); 43 | videoView.setVideoURI(Uri.parse(listBean.get(position).getBannerUrl())); 44 | //开始播放 45 | videoView.start(); 46 | container.addView(videoView); 47 | 48 | return videoView; 49 | } 50 | 51 | } 52 | 53 | @Override 54 | public void destroyItem(ViewGroup container, int position, Object object) { 55 | container.removeView((View) object); 56 | } 57 | 58 | @Override 59 | public int getCount() { 60 | return listBean.size(); 61 | } 62 | 63 | @Override 64 | public boolean isViewFromObject(View view, Object object) { 65 | return view == (View) object; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/adapter/MyPagerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.adapter; 2 | 3 | import android.support.v4.view.PagerAdapter; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | import android.widget.ImageView; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * Created by zhpan on 2016/7/26. 12 | */ 13 | public class MyPagerAdapter extends PagerAdapter{ 14 | List list; 15 | 16 | public MyPagerAdapter(List list) { 17 | this.list = list; 18 | } 19 | 20 | @Override 21 | public int getCount() { 22 | return list.size(); 23 | } 24 | 25 | @Override 26 | public boolean isViewFromObject(View view, Object object) { 27 | return view==object; 28 | } 29 | 30 | @Override 31 | public Object instantiateItem(ViewGroup container, int position) { 32 | ImageView imageView=list.get(position); 33 | container.addView(imageView); 34 | return list.get(position); 35 | } 36 | 37 | @Override 38 | public void destroyItem(ViewGroup container, int position, Object object) { 39 | container.removeView(list.get(position)); 40 | } 41 | } 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/bean/BannerModel.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.bean; 2 | 3 | public class BannerModel { 4 | private String bannerName; 5 | private String bannerUrl; 6 | private int playTime;//播放时长 7 | private int urlType;//类型:0图片、1视频 8 | 9 | 10 | public String getBannerName() { 11 | return bannerName; 12 | } 13 | 14 | public void setBannerName(String bannerName) { 15 | this.bannerName = bannerName; 16 | } 17 | 18 | public String getBannerUrl() { 19 | return bannerUrl; 20 | } 21 | 22 | public void setBannerUrl(String bannerUrl) { 23 | this.bannerUrl = bannerUrl; 24 | } 25 | 26 | public int getPlayTime() { 27 | return playTime; 28 | } 29 | 30 | public void setPlayTime(int playTime) { 31 | this.playTime = playTime; 32 | } 33 | 34 | public int getUrlType() { 35 | return urlType; 36 | } 37 | 38 | public void setUrlType(int urlType) { 39 | this.urlType = urlType; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/model/Userbean.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.model; 2 | 3 | public class Userbean { 4 | private String name; 5 | private int age; 6 | 7 | public String getName() { 8 | return name; 9 | } 10 | 11 | public void setName(String name) { 12 | this.name = name; 13 | } 14 | 15 | public int getAge() { 16 | return age; 17 | } 18 | 19 | public void setAge(int age) { 20 | this.age = age; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/qsvideo/danmaku/DanmakuConfig.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.qsvideo.danmaku; 2 | 3 | import java.util.HashMap; 4 | 5 | import master.flame.danmaku.danmaku.model.BaseDanmaku; 6 | import master.flame.danmaku.danmaku.model.IDisplayer; 7 | import master.flame.danmaku.danmaku.model.android.DanmakuContext; 8 | 9 | 10 | /** 11 | * Created by song 12 | * Contact github.com/tohodog 13 | * Date 2018/5/8 14 | * 弹幕设置 15 | */ 16 | 17 | public class DanmakuConfig { 18 | 19 | 20 | private static DanmakuContext mContext; 21 | 22 | public static DanmakuContext getDefaultContext() { 23 | if (mContext != null) 24 | return mContext; 25 | 26 | // 设置最大显示行数 27 | HashMap maxLinesPair = new HashMap<>(); 28 | maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 5); // 滚动弹幕最大显示5行 29 | // 设置是否禁止重叠 30 | HashMap overlappingEnablePair = new HashMap<>(); 31 | overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_RL, true); 32 | overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_TOP, true); 33 | mContext = DanmakuContext.create(); 34 | mContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3) 35 | .setDuplicateMergingEnabled(false) 36 | .setScrollSpeedFactor(1.2f).setScaleTextSize(1.2f) 37 | // .setCacheStuffer(new SpannedCacheStuffer(), mCacheStufferAdapter) // 图文混排使用SpannedCacheStuffer 38 | // .setCacheStuffer(new BackgroundCacheStuffer()) // 绘制背景使用BackgroundCacheStuffer 39 | .setMaximumLines(maxLinesPair) 40 | .preventOverlapping(overlappingEnablePair) 41 | .setDanmakuMargin(40); 42 | return mContext; 43 | } 44 | 45 | 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/qsvideo/io/IProgress.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.qsvideo.io; 2 | 3 | /** 4 | * Created by song on 2017/2/24. 5 | */ 6 | 7 | public interface IProgress { 8 | void onProgress(long rw, long all); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/qsvideo/io/WriteHelp.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.qsvideo.io; 2 | 3 | 4 | import java.io.BufferedInputStream; 5 | import java.io.BufferedOutputStream; 6 | import java.io.File; 7 | import java.io.FileInputStream; 8 | import java.io.FileNotFoundException; 9 | import java.io.FileOutputStream; 10 | import java.io.IOException; 11 | import java.io.InputStream; 12 | import java.io.OutputStream; 13 | 14 | /** 15 | * Created by song on 2017/1/19. 16 | * edit 2018-4-3 完善 17 | * 写入读取文件流辅助类 18 | */ 19 | 20 | public class WriteHelp { 21 | 22 | public static WriteHelp sink(OutputStream os) { 23 | return new WriteHelp(os); 24 | } 25 | 26 | public static WriteHelp sink(File f) throws FileNotFoundException { 27 | return sink(new FileOutputStream(f)).allCount(f.length()); 28 | } 29 | 30 | public static WriteHelp sink(String path) throws FileNotFoundException { 31 | return sink(new File(path)); 32 | } 33 | 34 | private WriteHelp(OutputStream os) { 35 | this.os = os; 36 | bos = new BufferedOutputStream(os, buffSize); 37 | } 38 | 39 | 40 | private OutputStream os; 41 | private BufferedOutputStream bos; 42 | private IProgress hp; 43 | private long writeCount, allCount = -1; 44 | private int buffSize = 1024 * 64;//缓存小了 大文件读写影响大 45 | private boolean isNoClose;//写入后不关闭流,可以连续写入 46 | 47 | public WriteHelp listener(IProgress hp) { 48 | this.hp = hp; 49 | return this; 50 | } 51 | 52 | public WriteHelp allCount(long allCount) { 53 | this.allCount = allCount; 54 | return this; 55 | } 56 | 57 | // 58 | public WriteHelp writeString(String s, String charset) throws IOException { 59 | return writeBytes(s.getBytes(charset)); 60 | } 61 | 62 | public WriteHelp writeString(String s) throws IOException { 63 | return writeBytes(s.getBytes()); 64 | } 65 | 66 | public WriteHelp writeBytes(byte[] bytes) throws IOException { 67 | int offset = 0, all = bytes.length, buf = 4 * 1024; 68 | allCount = all; 69 | while (offset < all) { 70 | int len = Math.min(buf, all - offset); 71 | write(bytes, offset, len); 72 | offset += len; 73 | } 74 | close(); 75 | return this; 76 | } 77 | 78 | 79 | //资源来自文件路径 80 | public WriteHelp writeByFile(String file) throws IOException { 81 | return writeByFile(new File(file)); 82 | } 83 | 84 | //资源来自文件 85 | public WriteHelp writeByFile(File file) throws IOException { 86 | allCount = file.length(); 87 | return writeByStream(new FileInputStream(file)); 88 | } 89 | 90 | //资源来自流 91 | public WriteHelp writeByStream(InputStream is) throws IOException { 92 | BufferedInputStream bis = new BufferedInputStream(is, buffSize); 93 | byte[] buf = new byte[4 * 1024]; 94 | int len; 95 | while ((len = bis.read(buf)) > 0) { 96 | write(buf, 0, len); 97 | } 98 | is.close(); 99 | bis.close(); 100 | close(); 101 | return this; 102 | } 103 | 104 | private void write(byte[] bytes, int offset, int count) throws IOException { 105 | bos.write(bytes, offset, count); 106 | writeCount += count; 107 | if (hp != null) 108 | hp.onProgress(writeCount, allCount); 109 | } 110 | 111 | public void close() throws IOException { 112 | if (isNoClose) 113 | return; 114 | bos.flush(); 115 | bos.close(); 116 | os.close(); 117 | } 118 | 119 | 120 | public WriteHelp noClose() { 121 | isNoClose = true; 122 | return this; 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/qsvideo/listvideo/CallBack.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.qsvideo.listvideo; 2 | 3 | import android.view.View; 4 | 5 | public interface CallBack { 6 | 7 | //当前的item 滚动结束调用 8 | void activeOnScrolled(View activeView, int position); 9 | 10 | //当前的item 滚动中调用 11 | void activeOnScrolling(View activeView, int position); 12 | 13 | //销毁的item 14 | void deactivate(View currentView, int position); 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/qsvideo/listvideo/Getter.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.qsvideo.listvideo; 2 | 3 | import android.view.View; 4 | 5 | public interface Getter { 6 | View getChildAt(int position); 7 | 8 | int indexOfChild(View view); 9 | 10 | int getChildCount(); 11 | 12 | int getLastVisiblePosition(); 13 | 14 | int getFirstVisiblePosition(); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/qsvideo/listvideo/ListViewGetter.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.qsvideo.listvideo; 2 | 3 | import android.view.View; 4 | import android.widget.ListView; 5 | 6 | /** 7 | * 8 | */ 9 | public class ListViewGetter implements Getter { 10 | 11 | private final ListView mListView; 12 | 13 | public ListViewGetter(ListView listView) { 14 | mListView = listView; 15 | } 16 | 17 | @Override 18 | public View getChildAt(int position) { 19 | return mListView.getChildAt(position); 20 | } 21 | 22 | @Override 23 | public int indexOfChild(View view) { 24 | return mListView.indexOfChild(view); 25 | } 26 | 27 | @Override 28 | public int getChildCount() { 29 | return mListView.getChildCount(); 30 | } 31 | 32 | @Override 33 | public int getLastVisiblePosition() { 34 | return mListView.getLastVisiblePosition(); 35 | } 36 | 37 | @Override 38 | public int getFirstVisiblePosition() { 39 | return mListView.getFirstVisiblePosition(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/qsvideo/listvideo/RecyclerViewGetter.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.qsvideo.listvideo; 2 | 3 | import android.support.v7.widget.LinearLayoutManager; 4 | import android.support.v7.widget.RecyclerView; 5 | import android.view.View; 6 | 7 | 8 | /** 9 | * 10 | */ 11 | public class RecyclerViewGetter implements Getter { 12 | 13 | private LinearLayoutManager mLayoutManager; 14 | private RecyclerView mRecyclerView; 15 | 16 | public RecyclerViewGetter(LinearLayoutManager layoutManager, RecyclerView recyclerView) { 17 | mLayoutManager = layoutManager; 18 | mRecyclerView = recyclerView; 19 | } 20 | 21 | @Override 22 | public View getChildAt(int position) { 23 | return mLayoutManager.getChildAt(position); 24 | } 25 | 26 | @Override 27 | public int indexOfChild(View view) { 28 | return mRecyclerView.indexOfChild(view); 29 | } 30 | 31 | @Override 32 | public int getChildCount() { 33 | return mRecyclerView.getChildCount(); 34 | } 35 | 36 | @Override 37 | public int getLastVisiblePosition() { 38 | return mLayoutManager.findLastVisibleItemPosition(); 39 | } 40 | 41 | @Override 42 | public int getFirstVisiblePosition() { 43 | return mLayoutManager.findFirstVisibleItemPosition(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/utils/ListDataSave.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.utils; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | 6 | import com.google.gson.Gson; 7 | import com.google.gson.reflect.TypeToken; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class ListDataSave { 13 | private SharedPreferences preferences; 14 | private SharedPreferences.Editor editor; 15 | 16 | public ListDataSave(Context mContext, String preferenceName) { 17 | preferences = mContext.getSharedPreferences(preferenceName, Context.MODE_PRIVATE); 18 | editor = preferences.edit(); 19 | } 20 | 21 | /** 22 | * 保存List 23 | * 24 | * @param tag 25 | * @param datalist 26 | */ 27 | public void setDataList(String tag, List datalist) { 28 | if (null == datalist || datalist.size() <= 0) 29 | return; 30 | 31 | Gson gson = new Gson(); 32 | //转换成json数据,再保存 33 | String strJson = gson.toJson(datalist); 34 | editor.clear(); 35 | editor.putString(tag, strJson); 36 | editor.commit(); 37 | 38 | } 39 | 40 | /** 41 | * 获取List 42 | * 43 | * @param tag 44 | * @return 45 | */ 46 | public List getDataList(String tag) { 47 | List datalist = new ArrayList(); 48 | String strJson = preferences.getString(tag, null); 49 | if (null == strJson) { 50 | return datalist; 51 | } 52 | Gson gson = new Gson(); 53 | datalist = gson.fromJson(strJson, new TypeToken>() { 54 | }.getType()); 55 | return datalist; 56 | 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/dawn/bannerimageandvideo/widget/MyListView.java: -------------------------------------------------------------------------------- 1 | package com.dawn.bannerimageandvideo.widget; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.ListView; 6 | 7 | /** 8 | * 重新测量Listview的宽度和高度 9 | * 10 | */ 11 | public class MyListView extends ListView { 12 | 13 | public MyListView(Context context) { 14 | super(context); 15 | // TODO Auto-generated constructor stub 16 | } 17 | 18 | public MyListView(Context context, AttributeSet attrs) { 19 | super(context, attrs); 20 | // TODO Auto-generated constructor stub 21 | } 22 | 23 | public MyListView(Context context, AttributeSet attrs, int defStyleAttr) { 24 | super(context, attrs, defStyleAttr); 25 | // TODO Auto-generated constructor stub 26 | } 27 | 28 | @Override 29 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 30 | // 重新测量listview的高度 31 | int height = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, 32 | MeasureSpec.AT_MOST); 33 | super.onMeasure(widthMeasureSpec, height); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/radiu_blue.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/radiu_gray.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/red_dot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DawenZeng/BannerImageAndVideo/6aa42e59fd8d7aa1e4799c3cad9fd757c8aa8f5d/app/src/main/res/drawable/red_dot.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/red_dot_night.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DawenZeng/BannerImageAndVideo/6aa42e59fd8d7aa1e4799c3cad9fd757c8aa8f5d/app/src/main/res/drawable/red_dot_night.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_banner.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_eight.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | 14 | 15 | 19 | 20 | 28 | 29 | 30 | 38 | 39 | 43 | 44 |