Commit 04a61060 by Any

目前最新的体育项目

parent 6e2a5eec
*.iml
.gradle
/local.properties
/.idea/caches/build_file_checksums.ser
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
.DS_Store
/build
/captures
.externalNativeBuild
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
<option name="TOP_LEVEL_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="INNER_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="METHOD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
</value>
</option>
<option name="FIELD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="IGNORE_DEPRECATED" value="false" />
<option name="IGNORE_JAVADOC_PERIOD" value="true" />
<option name="IGNORE_DUPLICATED_THROWS" value="false" />
<option name="IGNORE_POINT_TO_ITSELF" value="false" />
<option name="myAdditionalJavadocTags" value="date" />
</inspection_tool>
</profile>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakeSettings">
<configurations>
<configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" />
</configurations>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>
\ No newline at end of file
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.jimind.sportdemo"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:recyclerview-v7:28.0.0'
//网络请求相关
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
implementation 'io.reactivex.rxjava2:rxjava:2.1.12'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
//刷新,加载
implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.5.1'
//注解
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
//加载图片
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
//图表
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
//水平分页
implementation 'com.gcssloop.recyclerview:pagerlayoutmanager:2.3.8'
//数据库
implementation files('libs/mysql-connector-java-5.1.47.jar')
//视频
implementation('de.mrmaffen:vlc-android-sdk:3.0.0') {
exclude module: 'support-v4'
}
//百度语音唤醒在线识别
implementation files('libs/bdasr_V3_20180801_d6f298a.jar')
}
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
package com.jimind.sportdemo;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.jimind.sportdemo", appContext.getPackageName());
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jimind.sportdemo">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!--唤醒词 需要以下权限-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--动态授权-->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!--添加百度唤醒识别信息-->
<meta-data
android:name="com.baidu.speech.APP_ID"
android:value="15143091" />
<meta-data
android:name="com.baidu.speech.API_KEY"
android:value="RePcB6M3UR7VC6P8Gr2Omk8G" />
<meta-data
android:name="com.baidu.speech.SECRET_KEY"
android:value="zMxFHu7T4N0QGFPrSvP5qh0i1V69yzGb " />
<!--添加唤醒识别服务-->
<service
android:name="com.baidu.speech.VoiceRecognitionService"
android:exported="false" />
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".CourseDescActivity"
android:configChanges="orientation|screenSize|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
<activity
android:name=".CoursePlayActivity"
android:configChanges="orientation|screenSize|keyboardHidden" />
<activity
android:name=".SignActivity"
android:configChanges="orientation|screenSize|keyboardHidden" />
<activity
android:name=".SummaryActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="landscape" />
<activity
android:name=".StatisticsActivity"
android:configChanges="orientation|screenSize|keyboardHidden" />
<activity
android:name=".SettingActivity"
android:configChanges="orientation|screenSize|keyboardHidden" />
</application>
</manifest>
\ No newline at end of file
package com.jimind.sportdemo;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.jimind.sportdemo.api.ApiManager;
import com.jimind.sportdemo.base.BaseActivity;
import com.jimind.sportdemo.base.BaseObserver;
import com.jimind.sportdemo.base.ResponseResult;
import com.jimind.sportdemo.bean.Course;
import com.jimind.sportdemo.utils.AppManager;
import com.jimind.sportdemo.utils.CommonUtils;
import com.jimind.sportdemo.utils.Constant;
import com.jimind.sportdemo.utils.GlideApp;
import butterknife.BindView;
import butterknife.OnClick;
import io.reactivex.schedulers.Schedulers;
/**
* 课程详情
*
* @author Any
*/
public class CourseDescActivity extends BaseActivity {
@BindView(R.id.include_title)
FrameLayout flTitleBar;
@BindView(R.id.tv_bar_title)
TextView tvBarTitle;
@BindView(R.id.tv_course_name)
TextView tvCourseName;
@BindView(R.id.pb_star)
ProgressBar pbStar;
@BindView(R.id.tv_introduce)
TextView tvIntroduce;
@BindView(R.id.tv_grade_class)
TextView tvGradeClass;
@BindView(R.id.tv_number)
TextView tvNumber;
@BindView(R.id.iv_video)
ImageView ivVideo;
private Course mCourse;
private String mClassName;
private int mTotalNumber;
public static CourseDescActivity mActivity;
@Override
protected int getLayoutResource() {
return R.layout.activity_course_desc;
}
@Override
protected void initView() {
CommonUtils.initTitleBar(this, flTitleBar);
mActivity=this;
mTotalNumber = Integer.valueOf(tvNumber.getText().toString());
}
@Override
protected void initData() {
Intent intent = this.getIntent();
mClassName = intent.getStringExtra(Constant.CLASS_NAME);
mCourse= (Course)intent.getSerializableExtra(Constant.COURSE);
tvBarTitle.setText(mCourse.getCourseName());
tvCourseName.setText(mCourse.getCourseName());
pbStar.setProgress(mCourse.getDifficultyLevel() * CommonUtils.dip2px(this, 20));
tvGradeClass.setText(mCourse.getGradeName() + mClassName);
tvIntroduce.setText(mCourse.getCourseDescribe());
GlideApp
.with(this)
.load(Constant.LABEL+
MyApplication.getInstance().getHost()
+Constant.RESOURCE_PORT+mCourse.getCourseDescUrl())
.into(ivVideo);
}
@OnClick({R.id.ib_bar_back, R.id.bt_subtract, R.id.bt_plus, R.id.bt_start})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.ib_bar_back:
finish();
break;
case R.id.bt_subtract:
//减少
mTotalNumber = mTotalNumber - 5;
tvNumber.setText(String.valueOf(mTotalNumber));
break;
case R.id.bt_plus:
//增加
mTotalNumber = mTotalNumber + 5;
tvNumber.setText(String.valueOf(mTotalNumber));
break;
case R.id.bt_start:
sendToService();
Intent intent = new Intent(this, SignActivity.class);
intent.putExtra(Constant.CLASS_NAME,mClassName);
intent.putExtra(Constant.COURSE,mCourse);
intent.putExtra(Constant.TOTAL_NUMBER,mTotalNumber);
startActivity(intent);
break;
default:
}
}
/**
* 传给服务器
*/
private void sendToService() {
ApiManager.getInstance().requestService
.sendCommand(Constant.SIGN, "", "")
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(new BaseObserver<ResponseResult>() {
@Override
protected void onSuccess(ResponseResult responseResult) {
}
@Override
protected void onFailure(int code, String message) {
}
});
}
}
package com.jimind.sportdemo;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import android.net.Uri;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.constraint.ConstraintLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.speech.EventListener;
import com.baidu.speech.EventManager;
import com.baidu.speech.EventManagerFactory;
import com.baidu.speech.asr.SpeechConstant;
import com.jimind.sportdemo.adapter.SectionAdapter;
import com.jimind.sportdemo.api.ApiManager;
import com.jimind.sportdemo.base.BaseActivity;
import com.jimind.sportdemo.base.BaseObserver;
import com.jimind.sportdemo.base.ResponseResult;
import com.jimind.sportdemo.bean.Course;
import com.jimind.sportdemo.bean.Section;
import com.jimind.sportdemo.listener.MyClickListener;
import com.jimind.sportdemo.utils.CommonUtils;
import com.jimind.sportdemo.utils.Constant;
import com.jimind.sportdemo.utils.GlideApp;
import com.jimind.sportdemo.utils.TimeFormatUtils;
import com.jimind.sportdemo.view.VerticalSeekBar;
import org.json.JSONException;
import org.json.JSONObject;
import org.videolan.libvlc.IVLCVout;
import org.videolan.libvlc.LibVLC;
import org.videolan.libvlc.Media;
import org.videolan.libvlc.MediaPlayer;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import butterknife.BindView;
import butterknife.OnClick;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
* 课程播放
*
* @author Any
*/
public class CoursePlayActivity extends BaseActivity
implements MediaPlayer.EventListener, IVLCVout.Callback,
SeekBar.OnSeekBarChangeListener, MyClickListener,
View.OnTouchListener {
@BindView(R.id.cl_course_play)
ConstraintLayout clCoursePlay;
@BindView(R.id.tv_play_title)
TextView tvPlayTitle;
@BindView(R.id.tv_total_number)
TextView tvTotalNumber;
@BindView(R.id.tv_heart_beat)
TextView tvHeartBeat;
@BindView(R.id.tv_step_count)
TextView tvStepCount;
@BindView(R.id.tv_strength)
TextView tvStrength;
@BindView(R.id.tv_density)
TextView tvDensity;
@BindView(R.id.tv_reach_rate)
TextView tvReachRate;
@BindView(R.id.video_player)
SurfaceView mSurfaceView;
@BindView(R.id.iv_player)
ImageView ivPhotoPlayer;
@BindView(R.id.rlv_section)
RecyclerView rlvSection;
@BindView(R.id.ib_play)
ImageButton ibPlay;
@BindView(R.id.sk_play)
SeekBar skPlay;
@BindView(R.id.tv_current_time)
TextView tvCurrentTime;
@BindView(R.id.tv_total_time)
TextView tvTotalTime;
@BindView(R.id.ib_light)
ImageButton ibLight;
@BindView(R.id.ib_voice)
ImageButton ibVoice;
@BindView(R.id.ll_course_desc)
LinearLayout llCourseDesc;
@BindView(R.id.tv_section_count)
TextView tvSectionCount;
@BindView(R.id.tv_section_title)
TextView tvSectionTitle;
@BindView(R.id.tv_section_summary)
TextView tvSectionSummary;
@BindView(R.id.sk_voice)
VerticalSeekBar skVoice;
@BindView(R.id.sk_light)
VerticalSeekBar skLight;
private Course mCourse;
private LibVLC mLibVLC;
private Disposable mDisposable;
private MediaPlayer mMediaPlayer;
private EventManager mEventManager;
private EventListener mEventListener;
private SectionAdapter mSectionAdapter;
private LinearLayoutManager mLinearManager;
private boolean isPhotoPlaying, isFistInit = true;
private String mLastSectionId, mJson, mSectionId;
private List<Section> mResourceList = new ArrayList<>(), mSectionList = new ArrayList<>();
private int mLocation, mCurrentMills, mResourceDuration, mResourceType, mMaxVolume, mCurrentPosition, mLastPosition, mTotalNumber;
@Override
protected int getLayoutResource() {
return R.layout.activity_course_play;
}
@Override
protected void initView() {
CommonUtils.initTitleBar(this, clCoursePlay);
Intent intent = this.getIntent();
mTotalNumber = intent.getIntExtra(Constant.TOTAL_NUMBER, 0);
mCourse = (Course) intent.getSerializableExtra(Constant.COURSE);
tvPlayTitle.setText(mCourse.getCourseName());
tvTotalNumber.setText(String.valueOf(mTotalNumber));
//初始化recyclerView
mLinearManager = new LinearLayoutManager(this);
rlvSection.setLayoutManager(mLinearManager);
mSectionAdapter = new SectionAdapter(this);
rlvSection.setAdapter(mSectionAdapter);
//设置seekBar不能手动拖动
skPlay.setEnabled(false);
//设置文字较多时,可以滑动显示
tvSectionSummary.setMovementMethod(ScrollingMovementMethod.getInstance());
//初始化视频播放
mLibVLC = new LibVLC();
mMediaPlayer = new MediaPlayer(mLibVLC);
IVLCVout vlcVout = mMediaPlayer.getVLCVout();
vlcVout.setVideoView(mSurfaceView);
vlcVout.attachViews();
vlcVout.addCallback(this);
mMediaPlayer.setEventListener(this);
//设置音量
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
mMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
skVoice.setMax(mMaxVolume);
//设置当前设备静音
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
skVoice.setOnSeekBarChangeListener(this);
skVoice.setOnTouchListener(this);
//设置亮度,系统亮度值范围:0~255,应用窗口亮度范围:0.0f~1.0f。
skLight.setMax(255);
try {
int currentBright = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
skLight.setProgress(currentBright);
} catch (Exception e) {
e.printStackTrace();
}
skLight.setOnSeekBarChangeListener(this);
skLight.setOnTouchListener(this);
//百度语音,唤醒词
Map<String, Object> params = new HashMap<>();
params.put(SpeechConstant.WP_WORDS_FILE, "assets:///WakeUp.bin");
mJson = new JSONObject(params).toString();
}
@Override
protected void initData() {
getSectionList();
mEventManager = EventManagerFactory.create(this, "wp");
mEventListener = new EventListener() {
@Override
public void onEvent(String name, String params, byte[] data, int offset, int length) {
if ("wp.data".equals(name)) {
try {
JSONObject json = new JSONObject(params);
int errorCode = json.getInt("errorCode");
if (errorCode == 0) {
//唤醒成功
String word = json.getString("word");
Log.e("com.jimind.sportdemo", "current word = " + word);
switch (word) {
case Constant.START:
break;
case Constant.PLAY:
case Constant.PAUSE:
controlPlay();
break;
case Constant.RESTART:
click(mCurrentPosition);
break;
case Constant.INCREASE_VOLUME:
sendToService(Constant.VOLUME, "0.5", "");
break;
case Constant.DECREASE_VOLUME:
sendToService(Constant.VOLUME, "0.3", "");
break;
case Constant.INCREASE_LIGHT:
break;
case Constant.DECREASE_LIGHT:
break;
default:
}
} else {
//唤醒失败
}
} catch (JSONException e) {
e.printStackTrace();
}
} else if ("wp.exit".equals(name)) {
//唤醒已停止
}
}
};
mEventManager.registerListener(mEventListener);
}
/**
* 获取小节列表
*/
private void getSectionList() {
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
Connection connection = MainActivity.getConnection();
Statement statement = connection.createStatement();
String resource = "select * from sectionresource where CID="
+ mCourse.getCourseId() +
" order by SectionSort,VideoINSectionSort";
ResultSet resultSet = statement.executeQuery(resource);
while (resultSet.next()) {
Section section = new Section();
String sectionId = resultSet.getString(1);
section.setSectionId(sectionId);
section.setSectionName(resultSet.getString(3));
section.setSectionUrl(resultSet.getString(4));
section.setSectionDescribe(resultSet.getString(5));
section.setSectionDuration(resultSet.getInt(7));
section.setResourceDuration(resultSet.getInt(13));
section.setResourceUrl(resultSet.getString(14));
section.setResourceType(resultSet.getInt(18));
mResourceList.add(section);
//用于适配器列表
if (mSectionList.size() == 0) {
mSectionList.add(section);
mLastSectionId = sectionId;
} else {
if (!sectionId.equals(mLastSectionId)) {
mSectionList.add(section);
mLastSectionId = sectionId;
}
}
}
emitter.onNext(1);
emitter.onComplete();
resultSet.close();
statement.close();
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Object>() {
@Override
protected void onSuccess(Object o) {
mSectionAdapter.setDataList(mSectionList);
//初始化播放第一节播放视频
click(0);
}
@Override
protected void onFailure(int code, String message) {
}
});
}
/**
* 点击小节列表
*
* @param position
*/
@Override
public void click(int position) {
mCurrentPosition = position;
String sectionId = mSectionList.get(position).getSectionId();
mSectionId = sectionId;
sendToService(Constant.BEGIN, String.valueOf(mCourse.getCourseId()), mSectionId);
if (mResourceType == 1) {
skPlay.setProgress(0);
mCurrentMills = 0;
close();
} else if (mResourceType == 2) {
mMediaPlayer.stop();
mMediaPlayer.setTime(0);
skPlay.setProgress(0);
}
for (int i = 0; i < mResourceList.size(); i++) {
if (sectionId.equals(mResourceList.get(i).getSectionId())) {
mLocation = i;
break;
}
}
setResource(mLocation);
updateBackground();
}
/**
* 发送指令给服务器
*/
private void sendToService(String type, String v1, String v2) {
ApiManager.getInstance().requestService
.sendCommand(type, v1, v2)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(new BaseObserver<ResponseResult>() {
@Override
protected void onSuccess(ResponseResult responseResult) {
}
@Override
protected void onFailure(int code, String message) {
}
});
}
/**
* 播放资源
*/
public void setResource(int location) {
Section section = mResourceList.get(location);
//播放的不同小节
if (!mSectionId.equals(section.getSectionId())) {
mSectionId = section.getSectionId();
sendToService(Constant.BEGIN, String.valueOf(mCourse.getCourseId()), mSectionId);
for (int i = 0; i < mSectionList.size(); i++) {
if (mSectionId.equals(mSectionList.get(i).getSectionId())) {
mCurrentPosition = i;
}
}
updateBackground();
}
tvSectionTitle.setText(section.getSectionName());
tvSectionSummary.setText(section.getSectionDescribe());
mResourceDuration = section.getResourceDuration();
mResourceType = section.getResourceType();
if (mResourceType == 1) {
//播放图片
ivPhotoPlayer.setVisibility(View.VISIBLE);
isPhotoPlaying = true;
skPlay.setMax(mResourceDuration);
tvTotalTime.setText("/" + TimeFormatUtils.formatSeconds(mResourceDuration));
GlideApp.with(CoursePlayActivity.this)
.load(Constant.LABEL + MyApplication.getInstance().getHost()
+ Constant.RESOURCE_PORT + section.getResourceUrl())
.into(ivPhotoPlayer);
updateProgress();
} else if (mResourceType == 2) {
//播放视频
ivPhotoPlayer.setVisibility(View.INVISIBLE);
Media media = new Media(mLibVLC,
Uri.parse(Constant.LABEL + MyApplication.getInstance().getHost()
+ Constant.RESOURCE_PORT + section.getResourceUrl()));
mMediaPlayer.setMedia(media);
mMediaPlayer.play();
}
ibPlay.setImageResource(R.drawable.pause);
}
/**
* 更新当前播放的小节样式
*/
private void updateBackground() {
tvSectionCount.setText((mCurrentPosition + 1) + "/" + mSectionList.size());
// if (isFistInit) {
// View currentView = mLinearManager.findViewByPosition(mCurrentPosition);
// if (currentView != null) {
// RecyclerView.ViewHolder holder = rlvSection.getChildViewHolder(currentView);
// ConstraintLayout clSection = holder.itemView.findViewById(R.id.cl_section);
// clSection.setBackgroundResource(R.drawable.bg_light_rectangle);
// mLastPosition = mCurrentPosition;
// isFistInit = false;
// }
// } else {
// if (mLastPosition != mCurrentPosition) {
// View currentView = mLinearManager.getChildAt(mCurrentPosition);
// if (currentView != null) {
// ConstraintLayout clSection = currentView.findViewById(R.id.cl_section);
// clSection.setBackgroundResource(R.drawable.bg_light_rectangle);
// }
// View lastView = mLinearManager.getChildAt(mLastPosition);
// if (lastView != null) {
// ConstraintLayout clSection = lastView.findViewById(R.id.cl_section);
// clSection.setBackgroundResource(android.R.color.transparent);
// }
// mLastPosition=mCurrentPosition;
// }
// }
}
/**
* 图片播放时,更新进度条
*/
public void updateProgress() {
Observable.interval(0, 1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
mDisposable = d;
}
@Override
public void onNext(Long aLong) {
if (!isPhotoPlaying) {
return;
}
if (mCurrentMills < mResourceDuration) {
mCurrentMills = mCurrentMills + 1000;
skPlay.setProgress(mCurrentMills);
String s = TimeFormatUtils.formatSeconds(mCurrentMills);
tvCurrentTime.setText(s);
} else {
//播放结束,继续播放下一节
onComplete();
mCurrentMills = 0;
isPhotoPlaying = false;
ibPlay.setImageResource(R.drawable.play);
if (mLocation < mResourceList.size() - 1) {
mLocation++;
setResource(mLocation);
}
}
}
@Override
public void onError(Throwable e) {
close();
}
@Override
public void onComplete() {
close();
}
});
}
@Override
public void onNewLayout(IVLCVout vlcVout, int width, int height, int visibleWidth, int visibleHeight, int sarNum, int sarDen) {
skPlay.setMax(mResourceDuration);
tvTotalTime.setText("/" + TimeFormatUtils.formatSeconds(mResourceDuration));
}
@Override
public void onSurfacesCreated(IVLCVout vlcVout) {
}
@Override
public void onSurfacesDestroyed(IVLCVout vlcVout) {
}
/**
* 播放过程中的监听
*
* @param event
*/
@Override
public void onEvent(MediaPlayer.Event event) {
long timeChanged = event.getTimeChanged();
if (timeChanged == 0 || mResourceDuration == 0) {
return;
}
Log.d("CoursePlay","timeChanged:"+timeChanged);
skPlay.setProgress((int) timeChanged);
tvCurrentTime.setText(TimeFormatUtils.formatSeconds(timeChanged));
if (timeChanged > mResourceDuration) {
//播放结束,继续播放下一个资源
mMediaPlayer.stop();
mMediaPlayer.setTime(0);
ibPlay.setImageResource(R.drawable.play);
if (mLocation < mResourceList.size() - 1) {
mLocation++;
setResource(mLocation);
}
}
}
/**
* seekBar改变时
*
* @param seekBar
* @param progress
* @param b
*/
@Override
public void onProgressChanged(SeekBar seekBar, final int progress, boolean b) {
if (seekBar.getId() == R.id.sk_voice) {
//调用接口,传递数值
} else {
//调用接口,传递数值
// Log.e("com.jimind.sportdemo", CommonUtils.setDoubleTwo(progress / 255));
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
/**
* 用于隐藏音量和亮度控制条
*
* @param view
* @param motionEvent
* @return
*/
@Override
public boolean onTouch(View view, final MotionEvent motionEvent) {
//抬起手势,5s后消失
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
if (view.getId() == R.id.sk_voice) {
skVoice.postDelayed(new Runnable() {
@Override
public void run() {
sendToService(Constant.VOLUME, CommonUtils.setDoubleTwo(skVoice.getProgress() / (float) mMaxVolume), "");
skVoice.setVisibility(View.INVISIBLE);
}
}, 2000);
} else if (view.getId() == R.id.sk_light) {
skLight.postDelayed(new Runnable() {
@Override
public void run() {
skLight.setVisibility(View.INVISIBLE);
}
}, 2000);
}
}
return false;
}
@OnClick({R.id.bt_stop, R.id.bt_record, R.id.bt_control,
R.id.ib_play, R.id.ib_light, R.id.ib_voice})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.bt_record:
//语音授权
initPermission();
break;
case R.id.bt_control:
//屏幕控制
break;
case R.id.ib_play:
//控制按钮
controlPlay();
break;
case R.id.ib_light:
//亮度调节
skLight.setVisibility(View.VISIBLE);
break;
case R.id.ib_voice:
//音量调节
skVoice.setVisibility(View.VISIBLE);
break;
case R.id.bt_stop:
//终止
close();
sendToService(Constant.STOP_COURSE, String.valueOf(mCourse.getCourseId()), "");
Intent intent = new Intent(this, SummaryActivity.class);
intent.putExtra(Constant.COURSE, mCourse);
intent.putExtra(Constant.TOTAL_NUMBER, mTotalNumber);
startActivity(intent);
finish();
break;
default:
}
}
/**
* android 6.0 以上需要动态申请权限
*/
private void initPermission() {
List<String> noPermissionList = new ArrayList<>();
String[] permissions = {Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
for (String permission : permissions) {
//没有权限
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
noPermissionList.add(permission);
}
}
String tmpList[] = new String[noPermissionList.size()];
if (!noPermissionList.isEmpty()) {
ActivityCompat.requestPermissions(this, noPermissionList.toArray(tmpList), 123);
} else {
//已经全部授权
start();
}
}
/**
* 动态授权回调
*
* @param requestCode 请求码
* @param permissions 授权权限
* @param grantResults 授权结果
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 123) {
if (grantResults.length > 0) {
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
return;
}
}
//权限全部同意
start();
}
}
}
/**
* 开始启动语音唤醒服务
*/
private void start() {
Toast.makeText(CoursePlayActivity.this, "您已开启语音服务!", Toast.LENGTH_SHORT).show();
mEventManager.send(SpeechConstant.WAKEUP_START, mJson, null, 0, 0);
}
/**
* 释放资源
*/
public void release() {
mEventManager.send(SpeechConstant.WAKEUP_STOP, null, null, 0, 0);
mEventManager.unregisterListener(mEventListener);
mEventManager = null;
}
/**
* 控制播放
*/
public void controlPlay() {
if (mResourceType == 1) {
if (isPhotoPlaying) {
//播放中-->暂停
sendToService(Constant.SUSPEND, "", "");
isPhotoPlaying = false;
ibPlay.setImageResource(R.drawable.play);
} else {
//暂停-->播放
sendToService(Constant.CONTINUE, "", "");
isPhotoPlaying = true;
ibPlay.setImageResource(R.drawable.pause);
}
} else if (mResourceType == 2) {
if (mMediaPlayer.isPlaying()) {
//播放中-->暂停
sendToService(Constant.SUSPEND, "", "");
mMediaPlayer.pause();
ibPlay.setImageResource(R.drawable.play);
} else {
//暂停-->播放
sendToService(Constant.CONTINUE, "", "");
mMediaPlayer.play();
ibPlay.setImageResource(R.drawable.pause);
}
}
}
/**
* 防止泄露
*/
private void close() {
if (mDisposable != null && !mDisposable.isDisposed()) {
mDisposable.dispose();
mDisposable = null;
}
}
@Override
protected void onPause() {
super.onPause();
//停止播放
mMediaPlayer.stop();
//取消屏幕常亮
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@Override
protected void onDestroy() {
super.onDestroy();
release();
//释放资源
if (mMediaPlayer != null) {
mMediaPlayer.getVLCVout().detachViews();
mMediaPlayer.release();
mMediaPlayer = null;
mLibVLC.release();
mLibVLC = null;
}
}
}
package com.jimind.sportdemo;
import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.constraint.ConstraintLayout;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.PopupWindow;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.gcssloop.widget.PagerGridLayoutManager;
import com.gcssloop.widget.PagerGridSnapHelper;
import com.jimind.sportdemo.adapter.CourseAdapter;
import com.jimind.sportdemo.adapter.PopupAdapter;
import com.jimind.sportdemo.api.ApiManager;
import com.jimind.sportdemo.base.BaseActivity;
import com.jimind.sportdemo.base.BaseObserver;
import com.jimind.sportdemo.base.ResponseResult;
import com.jimind.sportdemo.bean.Course;
import com.jimind.sportdemo.listener.MyClickListener;
import com.jimind.sportdemo.listener.PopupListener;
import com.jimind.sportdemo.utils.CommonUtils;
import com.jimind.sportdemo.utils.Constant;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
import java.security.KeyFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* 主页
*
* @author Any
*/
public class MainActivity extends BaseActivity
implements PagerGridLayoutManager.PageListener,
PopupListener, MyClickListener,
OnRefreshListener {
@BindView(R.id.bt_subject)
Button btSubject;
@BindView(R.id.bt_grade)
Button btGrade;
@BindView(R.id.bt_classes)
Button btClasses;
@BindView(R.id.bt_difficulty)
Button btDifficulty;
@BindView(R.id.et_search)
EditText etSearch;
@BindView(R.id.bt_search)
Button btSearch;
@BindView(R.id.bt_head_photo)
Button btHeadPhoto;
@BindView(R.id.cl_main)
ConstraintLayout clMain;
@BindView(R.id.ib_arrow_left)
ImageButton ibArrowLeft;
@BindView(R.id.sf_course)
SmartRefreshLayout sfCourse;
@BindView(R.id.rlv_course)
RecyclerView rlvCourse;
private int mLocation;
private boolean mIsInit = true;
private String mClassName, mSelectCourse;
private static Connection mConnection;
private PopupAdapter mPopupAdapter;
private CourseAdapter mListAdapter;
private PopupWindow mPopupWindow, mExitWindow;
private PagerGridLayoutManager mLayoutManager;
private List<Course> mCourseList = new ArrayList<>();
private List<String> mOptionList = new ArrayList<>();
@Override
protected int getLayoutResource() {
return R.layout.activity_main;
}
@Override
protected void initView() {
CommonUtils.initTitleBar(this, clMain);
MyApplication.getInstance().setTeacherName(btHeadPhoto.getText().toString());
mLayoutManager = new PagerGridLayoutManager(
2, 4, PagerGridLayoutManager.HORIZONTAL);
mLayoutManager.setAllowContinuousScroll(false);
rlvCourse.setLayoutManager(mLayoutManager);
PagerGridSnapHelper pageSnapHelper = new PagerGridSnapHelper();
pageSnapHelper.attachToRecyclerView(rlvCourse);
mListAdapter = new CourseAdapter(this);
rlvCourse.setAdapter(mListAdapter);
mLayoutManager.setPageListener(this);
sfCourse.setEnableLoadMore(false);
sfCourse.setOnRefreshListener(this);
initPopupWindow();
}
/**
* 初始化弹出框
*/
private void initPopupWindow() {
View recyclerPop = getLayoutInflater().inflate(R.layout.ppw_recycler, null);
View exitPop = getLayoutInflater().inflate(R.layout.item_popup, null);
mPopupWindow = new PopupWindow(recyclerPop, 130, 220, true);
mExitWindow = new PopupWindow(exitPop, 80, 60, true);
mPopupWindow.setTouchable(true);
mPopupWindow.setOutsideTouchable(true);
RecyclerView rlvPop = recyclerPop.findViewById(R.id.rlv_ppw);
TextView tvExit = exitPop.findViewById(R.id.tv_content);
tvExit.setBackgroundResource(R.drawable.pop_);
rlvPop.setLayoutManager(new LinearLayoutManager(this));
mPopupAdapter = new PopupAdapter(this);
rlvPop.setAdapter(mPopupAdapter);
tvExit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mExitWindow.dismiss();
onBackPressed();
}
});
}
/**
* 下拉刷新
*
* @param refreshLayout
*/
@Override
public void onRefresh(RefreshLayout refreshLayout) {
getCourseList();
}
/**
* 当总页数确定时的回调
*
* @param pageSize
*/
@Override
public void onPageSizeChanged(int pageSize) {
}
/**
* 当页面被选中时的回调(从 0 开始)
*
* @param pageIndex
*/
@Override
public void onPageSelect(int pageIndex) {
if (pageIndex == 0) {
ibArrowLeft.setVisibility(View.INVISIBLE);
} else {
ibArrowLeft.setVisibility(View.VISIBLE);
}
}
/**
* 查询数据库数据
*/
public void getCourseList() {
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
if (mIsInit||mConnection==null) {
Class.forName("com.mysql.jdbc.Driver");
mConnection = DriverManager.getConnection("jdbc:mysql://"
+ MyApplication.getInstance().getHost() + ":3306/gisports", "root", "root");
}
Statement statement = mConnection.createStatement();
ResultSet resultSet = statement.executeQuery(mSelectCourse);
mCourseList.clear();
while (resultSet.next()) {
Course course = new Course();
course.setCourseId(resultSet.getInt(1));
course.setCourseName(resultSet.getString(3));
course.setCourseDescUrl(resultSet.getString(4));
course.setCourseListUrl(resultSet.getString(5));
course.setCourseDescribe(resultSet.getString(6));
course.setGradeName(resultSet.getString(8));
course.setDifficultyLevel(resultSet.getInt(9));
mCourseList.add(course);
}
resultSet.close();
statement.close();
emitter.onNext(1);
emitter.onComplete();
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Object>() {
@Override
protected void onSuccess(Object o) {
sfCourse.finishRefresh();
mListAdapter.setDataList(mCourseList);
mIsInit = false;
}
@Override
protected void onFailure(int code, String message) {
}
});
}
@OnClick({R.id.bt_subject, R.id.bt_grade, R.id.bt_classes, R.id.bt_difficulty, R.id.bt_search,
R.id.bt_head_photo, R.id.bt_system_setting, R.id.bt_data_statistics,
R.id.ib_arrow_left, R.id.ib_arrow_right})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.bt_subject:
//科目
mLocation = 0;
String selectCategory = "select Type_Code from sys_dict_type where P_Type_Code='Category'";
selectOption(selectCategory,false);
break;
case R.id.bt_grade:
//年级
mLocation = 1;
String selectGrade = "select GradeName from course";
selectOption(selectGrade, false);
break;
case R.id.bt_classes:
//班级
String gradeName = btGrade.getText().toString();
if (gradeName.equals(Constant.GRADE)) {
Toast.makeText(this, "请先选择年级!", Toast.LENGTH_SHORT).show();
return;
}
mLocation = 2;
String selectionClass = "select ClassName from class where GradeName='" + gradeName + "'";
selectOption(selectionClass, false);
break;
case R.id.bt_difficulty:
//难度
mLocation = 3;
String selectDifficulty = "select DifficultyLevel from course";
selectOption(selectDifficulty, false);
break;
case R.id.bt_search:
CommonUtils.hideSoftKeyboard(this, etSearch);
String searchContent = etSearch.getText().toString();
if (!TextUtils.isEmpty(searchContent)) {
Toast.makeText(this, searchContent, Toast.LENGTH_SHORT).show();
}
break;
case R.id.bt_head_photo:
//头像,点击退出app
mExitWindow.showAsDropDown(btHeadPhoto);
break;
case R.id.bt_system_setting:
//系统设置
Intent setIntent = new Intent(this, SettingActivity.class);
startActivityForResult(setIntent, 101);
break;
case R.id.bt_data_statistics:
//数据统计
Intent dataIntent = new Intent(this, StatisticsActivity.class);
startActivity(dataIntent);
break;
case R.id.ib_arrow_left:
//左边-->前一页
mLayoutManager.smoothPrePage();
break;
case R.id.ib_arrow_right:
//右边-->下一页
mLayoutManager.smoothNextPage();
break;
default:
}
}
/**
* 搜索指定的列:科目,年级,班级,难度
*/
private void selectOption(final String selectSql,final boolean isClick) {
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
Statement statement = mConnection.createStatement();
ResultSet resultSet = statement.executeQuery(selectSql);
mOptionList.clear();
while (resultSet.next()) {
mOptionList.add(resultSet.getString(1));
}
resultSet.close();
statement.close();
if (isClick) {
return;
}
emitter.onNext("1");
emitter.onComplete();
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<String>() {
@Override
protected void onSuccess(String s) {
mPopupAdapter.setDataList(mOptionList);
switch (mLocation) {
case 0:
mPopupWindow.showAsDropDown(btSubject, 0, 20, Gravity.START);
break;
case 1:
mPopupWindow.showAsDropDown(btGrade, 0, 20, Gravity.START);
break;
case 2:
mPopupWindow.showAsDropDown(btClasses, 0, 20, Gravity.START);
break;
case 3:
mPopupWindow.showAsDropDown(btDifficulty, 0, 20, Gravity.START);
break;
default:
}
}
@Override
protected void onFailure(int code, String message) {
}
});
}
/**
* 弹出框内容点击事件
*
* @param content
*/
@Override
public void click(String content) {
switch (mLocation) {
case 0:
btSubject.setText(content);
String category = btSubject.getText().toString();
mSelectCourse = "select * from course where Category='" + category + "'";
sfCourse.autoRefresh();
break;
case 1:
btGrade.setText(content);
mSelectCourse = "select * from course where GradeName='" + btGrade.getText().toString().trim()+ "'";
sfCourse.autoRefresh();
break;
case 2:
btClasses.setText(content);
break;
case 3:
btDifficulty.setText(content);
mSelectCourse = "select * from course where DifficultyLevel='" + btDifficulty.getText().toString() + "'";
sfCourse.autoRefresh();
break;
default:
}
mPopupWindow.dismiss();
}
/**
* 点击课程,显示选择班级对话框
*
* @param position
*/
@Override
public void click(int position) {
Course course = mCourseList.get(position);
mClassName = btClasses.getText().toString();
if (mClassName.equals(Constant.CLASS)) {
//没有选择班级
String selectionClass = "select ClassName from class where GradeName='" + course.getGradeName() + "'";
selectOption(selectionClass,true);
showMyDialog(course);
} else {
//直接跳转
sendToService(course);
toCourseDesc(course);
}
}
/**
* 显示选择班级对话框
*/
private void showMyDialog(final Course course) {
int textColor = ContextCompat.getColor(this, R.color.textColor);
View inflate = getLayoutInflater().inflate(R.layout.dialog_class, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(inflate);
final AlertDialog dialog = builder.create();
TextView tvGrade = inflate.findViewById(R.id.tv_class_grade);
tvGrade.setText(course.getGradeName());
Button btPositive = inflate.findViewById(R.id.bt_positive);
Button btNegative = inflate.findViewById(R.id.bt_negative);
RadioGroup rgClass = inflate.findViewById(R.id.rg_class);
RadioGroup.LayoutParams lp = new RadioGroup.LayoutParams(RadioGroup.LayoutParams.WRAP_CONTENT, RadioGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(20, 10, 0, 0);
for (int i = 0; i < mOptionList.size(); i++) {
RadioButton radioButton = new RadioButton(this);
radioButton.setId(i);
radioButton.setWidth(100);
radioButton.setHeight(100);
radioButton.setButtonDrawable(R.drawable.selector_class);
radioButton.setPadding(20, 0, 0, 0);
radioButton.setText(mOptionList.get(i));
radioButton.setTextColor(textColor);
radioButton.setTextSize(22);
rgClass.addView(radioButton, i, lp);
}
rgClass.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
mClassName = mOptionList.get(i);
}
});
btPositive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
sendToService(course);
toCourseDesc(course);
}
});
btNegative.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
dialog.show();
//修改对话框的宽高
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.width = CommonUtils.dip2px(this, 460);
params.height = CommonUtils.dip2px(this, 360);
dialog.getWindow().setAttributes(params);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
}
/**
* 跳转到到课程详情
* @param course 课程
*/
private void toCourseDesc(Course course){
Intent intent = new Intent(MainActivity.this, CourseDescActivity.class);
intent.putExtra(Constant.CLASS_NAME,mClassName);
intent.putExtra(Constant.COURSE,course);
startActivity(intent);
}
/**
* 传给服务器
*/
private void sendToService(Course course) {
ApiManager.getInstance().requestService
.sendCommand(Constant.CHECK_COURSE, String.valueOf(course.getCourseId()), "")
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(new BaseObserver<ResponseResult>() {
@Override
protected void onSuccess(ResponseResult responseResult) {
}
@Override
protected void onFailure(int code, String message) {
}
});
}
/**
* 刷新页面
*
* @param requestCode 请求码
* @param resultCode 结果码
* @param data 数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (resultCode == 200) {
if (data!=null){
String ip = data.getStringExtra("ip");
if(!TextUtils.isEmpty(ip)){
mSelectCourse = "select * from course";
sfCourse.autoRefresh();
}
}
}
}
/**
* 获取连接对象
*
* @return 连接对象
*/
public static Connection getConnection() {
return mConnection;
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
if (mConnection!=null){
mConnection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package com.jimind.sportdemo;
import android.app.Application;
import android.content.Context;
import android.support.annotation.NonNull;
import com.jimind.sportdemo.bean.Course;
import com.jimind.sportdemo.utils.DynamicTimeFormat;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator;
import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator;
import com.scwang.smartrefresh.layout.api.RefreshFooter;
import com.scwang.smartrefresh.layout.api.RefreshHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
/**
* Application
*
* @author Any
*/
public class MyApplication extends Application {
private String mTeacherName;
private Course mCourse;
private String mClassName;
private int mTotalNumber;
private String mHost;
private static MyApplication myApplication;
@Override
public void onCreate() {
super.onCreate();
myApplication = this;
}
public static MyApplication getInstance() {
return myApplication;
}
public String getTeacherName() {
return mTeacherName;
}
public void setTeacherName(String teacherName) {
this.mTeacherName = teacherName;
}
public String getHost() {
return mHost;
}
public void setHost(String host) {
this.mHost = host;
}
static {
//设置全局的Header构建器
SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
@NonNull
@Override
public RefreshHeader createRefreshHeader(@NonNull Context context, @NonNull RefreshLayout layout) {
//全局设置主题颜色
layout.setPrimaryColorsId(android.R.color.transparent, R.color.textColor);
return new ClassicsHeader(context).setTimeFormat(new DynamicTimeFormat("更新于 %s"));
}
});
//设置全局的Footer构建器
SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
@NonNull
@Override
public RefreshFooter createRefreshFooter(@NonNull Context context, @NonNull RefreshLayout layout) {
//指定为经典Footer,默认是 BallPulseFooter
return new ClassicsFooter(context).setDrawableSize(20);
}
});
}
}
package com.jimind.sportdemo;
import android.content.Intent;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.jimind.sportdemo.base.BaseActivity;
import com.jimind.sportdemo.utils.CommonUtils;
import butterknife.BindView;
import butterknife.OnClick;
/**
* 系统配置
*
* @author Any
*/
public class SettingActivity extends BaseActivity {
@BindView(R.id.fl_setting)
FrameLayout flTitleBar;
@BindView(R.id.tv_bar_title)
TextView tvBarTitle;
@BindView(R.id.et_ip)
EditText etIp;
@Override
protected int getLayoutResource() {
return R.layout.activity_setting;
}
@Override
protected void initView() {
CommonUtils.initTitleBar(this, flTitleBar);
tvBarTitle.setText("系统设置");
}
@OnClick({R.id.ib_bar_back, R.id.bt_sure})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.ib_bar_back:
showTip();
Intent intent=new Intent();
intent.putExtra("ip",etIp.getText().toString());
setResult(200,intent);
finish();
break;
case R.id.bt_sure:
showTip();
break;
default:
}
}
/**
* 显示提示
*/
private void showTip() {
String ip = etIp.getText().toString();
if (TextUtils.isEmpty(ip)) {
Toast.makeText(SettingActivity.this, "您还没有设置IP!", Toast.LENGTH_SHORT).show();
}
MyApplication.getInstance().setHost(ip);
Toast.makeText(SettingActivity.this, "设置成功", Toast.LENGTH_SHORT).show();
}
}
package com.jimind.sportdemo;
import android.content.Intent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.jimind.sportdemo.api.ApiManager;
import com.jimind.sportdemo.base.BaseActivity;
import com.jimind.sportdemo.base.BaseObserver;
import com.jimind.sportdemo.base.ResponseResult;
import com.jimind.sportdemo.bean.Course;
import com.jimind.sportdemo.utils.CommonUtils;
import com.jimind.sportdemo.utils.Constant;
import com.jimind.sportdemo.view.SignProgressBar;
import java.util.concurrent.TimeUnit;
import butterknife.BindView;
import butterknife.OnClick;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
* 签到
*
* @author Any
*/
public class SignActivity extends BaseActivity {
@BindView(R.id.fl_title_bar)
FrameLayout flTitleBar;
@BindView(R.id.tv_bar_title)
TextView tvBarTitle;
@BindView(R.id.tv_sign_course)
TextView tvSignCourse;
@BindView(R.id.tv_sign_class)
TextView tvSignClass;
@BindView(R.id.tv_total_count)
TextView tvTotalCount;
@BindView(R.id.tv_minute)
TextView tvMinute;
@BindView(R.id.tv_second)
TextView tvSecond;
@BindView(R.id.pb_sign)
SignProgressBar pbSign;
private Course mCourse;
private String mClassName;
private Disposable mDisposable;
private int mCurrentMills, mCurrentProgress, mTotalNumber;
@Override
protected int getLayoutResource() {
return R.layout.activity_sign;
}
@Override
protected void initView() {
CommonUtils.initTitleBar(this, flTitleBar);
tvBarTitle.setText("正在签入中");
Intent intent = this.getIntent();
mClassName = intent.getStringExtra(Constant.CLASS_NAME);
mTotalNumber = intent.getIntExtra(Constant.TOTAL_NUMBER, 0);
mCourse = (Course) intent.getSerializableExtra(Constant.COURSE);
tvSignCourse.setText(mCourse.getCourseName());
tvSignClass.setText(mCourse.getGradeName() + mClassName);
tvTotalCount.setText("应到:" + mTotalNumber + "人");
pbSign.setTotalProgress(mTotalNumber);
}
@Override
protected void initData() {
Observable.interval(0, 1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
mDisposable = d;
}
@Override
public void onNext(Long aLong) {
mCurrentMills++;
int minute = mCurrentMills / 60;
int second = mCurrentMills % 60;
if (second < 10) {
tvSecond.setText("0" + second + "秒");
} else {
tvSecond.setText(second + "秒");
}
if (minute < 10) {
tvMinute.setText("0" + minute + "分钟");
} else {
tvMinute.setText(minute + "分钟");
}
if (mCurrentProgress < mTotalNumber) {
mCurrentProgress++;
pbSign.setProgress(mCurrentProgress);
}
}
@Override
public void onError(Throwable e) {
close();
}
@Override
public void onComplete() {
close();
}
});
}
/**
* 防止泄露
*/
private void close() {
if (mDisposable != null && !mDisposable.isDisposed()) {
mDisposable.dispose();
mDisposable = null;
}
}
@OnClick({R.id.ib_bar_back, R.id.bt_finish, R.id.bt_skip})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.ib_bar_back:
finish();
break;
case R.id.bt_finish:
case R.id.bt_skip:
sendToService();
Intent intent = new Intent(this, CoursePlayActivity.class);
intent.putExtra(Constant.COURSE,mCourse);
intent.putExtra(Constant.TOTAL_NUMBER,mTotalNumber);
startActivity(intent);
finish();
break;
default:
}
}
/**
* 传给服务器
*/
private void sendToService() {
ApiManager.getInstance().requestService
.sendCommand(Constant.START_COURSE, String.valueOf(mCourse.getCourseId()), "")
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(new BaseObserver<ResponseResult>() {
@Override
protected void onSuccess(ResponseResult responseResult) {
}
@Override
protected void onFailure(int code, String message) {
}
});
}
@Override
protected void onPause() {
super.onPause();
close();
}
}
package com.jimind.sportdemo;
import android.graphics.Color;
import android.support.constraint.ConstraintLayout;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.charts.HorizontalBarChart;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.CombinedData;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.jimind.sportdemo.adapter.TeacherAdapter;
import com.jimind.sportdemo.base.BaseActivity;
import com.jimind.sportdemo.bean.Bill;
import com.jimind.sportdemo.utils.CommonUtils;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
/**
* 数据统计
*
* @author Any
*/
public class StatisticsActivity extends BaseActivity {
@BindView(R.id.tv_bar_title)
TextView tvBarTitle;
@BindView(R.id.cl_statistics)
ConstraintLayout clTitleBar;
@BindView(R.id.school_chart)
LineChart schoolChart;
@BindView(R.id.rlv_teacher)
RecyclerView rlvTeacher;
@BindView(R.id.grade_chart)
HorizontalBarChart gradeChart;
@BindView(R.id.class_chart)
HorizontalBarChart classChart;
@BindView(R.id.tv_data_date)
TextView tvDataDate;
private int textColor, lineColor;
private TeacherAdapter mTeacherAdapter;
private BarDataSet mGradeSet, mClassSet;
private LineDataSet mCourseSet, mLoadSet, mRateSet;
private List<BarEntry> mGradeEntry = new ArrayList<>(), mClassEntry = new ArrayList<>();
private List<Entry> mCourseEntry = new ArrayList<>(), mLoadEntry = new ArrayList<>(), mRateEntry = new ArrayList<>();
@Override
protected int getLayoutResource() {
return R.layout.activity_statistics;
}
@Override
protected void initView() {
CommonUtils.initTitleBar(this, clTitleBar);
tvBarTitle.setText("数据统计");
textColor = ContextCompat.getColor(this, R.color.lengendColor);
lineColor = ContextCompat.getColor(this, R.color.highLightColor);
rlvTeacher.setLayoutManager(new LinearLayoutManager(this));
mTeacherAdapter = new TeacherAdapter(this);
rlvTeacher.setAdapter(mTeacherAdapter);
initLineChart();
initGradeChart();
initClassChart();
}
private void initClassChart() {
classChart.getDescription().setEnabled(false);
classChart.setDoubleTapToZoomEnabled(false);
classChart.getLegend().setEnabled(false);
classChart.setTouchEnabled(false);
classChart.setExtraOffsets(20f, 0f, 20f, 20f);
classChart.getAxisLeft().setEnabled(false);
XAxis xAxis = classChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setTextColor(textColor);
xAxis.setTextSize(12f);
xAxis.setDrawGridLines(false);
xAxis.setAxisMinimum(-0.5f);
xAxis.setAxisMaximum(6.5f);
xAxis.setLabelCount(7);
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
int xValue = (int) value;
if (xValue >= 0 && xValue < 7) {
return "1年级" + String.valueOf(xValue + 1) + "班";
}
return null;
}
});
YAxis leftAxis = classChart.getAxisRight();
leftAxis.setTextColor(textColor);
leftAxis.setTextSize(12f);
leftAxis.setDrawGridLines(true);
leftAxis.setDrawAxisLine(false);
leftAxis.setAxisMinimum(5f);
leftAxis.setAxisMaximum(30f);
leftAxis.setLabelCount(6, true);
leftAxis.enableGridDashedLine(3f, 3f, 0);
}
private void initGradeChart() {
gradeChart.getDescription().setEnabled(false);
gradeChart.setDoubleTapToZoomEnabled(false);
gradeChart.getLegend().setEnabled(false);
gradeChart.setTouchEnabled(false);
gradeChart.setExtraOffsets(20f, 0f, 20f, 20f);
gradeChart.getAxisLeft().setEnabled(false);
XAxis xAxis = gradeChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setTextColor(textColor);
xAxis.setTextSize(12f);
xAxis.setDrawGridLines(false);
xAxis.setAxisMinimum(-0.5f);
xAxis.setAxisMaximum(5.5f);
xAxis.setLabelCount(6);
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
int xValue = (int) value;
if (xValue >= 0 && xValue < 6) {
return String.valueOf(xValue + 1) + "年级";
}
return null;
}
});
YAxis leftAxis = gradeChart.getAxisRight();
leftAxis.setTextColor(textColor);
leftAxis.setTextSize(12f);
leftAxis.setDrawGridLines(true);
leftAxis.setDrawAxisLine(false);
leftAxis.setAxisMinimum(5f);
leftAxis.setAxisMaximum(30f);
leftAxis.setLabelCount(6, true);
leftAxis.enableGridDashedLine(3f, 3f, 0);
}
private void initLineChart() {
schoolChart.getDescription().setEnabled(false);
schoolChart.setDoubleTapToZoomEnabled(false);
schoolChart.getLegend().setEnabled(true);
schoolChart.setTouchEnabled(false);
schoolChart.setExtraOffsets(20f, 0f, 20f, 20f);
Legend legend = schoolChart.getLegend();
legend.setTextSize(12f);
legend.setTextColor(textColor);
legend.setForm(Legend.LegendForm.LINE);
legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
XAxis xAxis = schoolChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setTextColor(textColor);
xAxis.setTextSize(12f);
xAxis.setDrawGridLines(false);
xAxis.setAxisMinimum(0f);
xAxis.setAxisMaximum(4f);
xAxis.setLabelCount(5, true);
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
int xValue = (int) value;
if (xValue >= 0 && xValue < 5) {
return "周" + String.valueOf(xValue + 1);
}
return null;
}
});
YAxis rightAxis = schoolChart.getAxisRight();
rightAxis.setTextColor(textColor);
rightAxis.setTextSize(12f);
rightAxis.setDrawGridLines(true);
rightAxis.setDrawAxisLine(false);
rightAxis.setAxisMinimum(0.5f);
rightAxis.setAxisMaximum(3f);
rightAxis.setLabelCount(5, true);
rightAxis.enableGridDashedLine(5f, 5f, 0);
YAxis leftAxis = schoolChart.getAxisLeft();
leftAxis.setTextColor(textColor);
leftAxis.setTextSize(12f);
leftAxis.setDrawGridLines(false);
leftAxis.setDrawAxisLine(false);
leftAxis.setAxisMinimum(0f);
leftAxis.setAxisMaximum(100f);
leftAxis.setLabelCount(5, true);
}
@Override
protected void initData() {
List<Bill> billList = new ArrayList<>();
for (int i = 0; i < 20; i++) {
Bill bill = new Bill();
bill.setName("王明");
bill.setLoad("1.7");
bill.setDensity("60%");
billList.add(bill);
}
mTeacherAdapter.setDataList(billList);
for (int i = 0; i < 5; i++) {
float val1 = (float) (Math.random() * 100);
float val2 = (float) (Math.random() * 100);
float val3 = (float) (Math.random() * 2);
float val4 = (float) (Math.random() * 30);
float val5 = (float) (Math.random() * 30);
mCourseEntry.add(new Entry(i, val1));
mLoadEntry.add(new Entry(i, val2));
mRateEntry.add(new Entry(i, val3));
mGradeEntry.add(new BarEntry(i, val4));
mClassEntry.add(new BarEntry(i, val5));
}
mGradeEntry.add(new BarEntry(5, 25));
mClassEntry.add(new BarEntry(5, 15));
mClassEntry.add(new BarEntry(6, 25));
mCourseSet = new LineDataSet(mCourseEntry, "课程数");
mCourseSet.setAxisDependency(YAxis.AxisDependency.LEFT);
mCourseSet.setColor(lineColor);
mCourseSet.setDrawCircles(false);
mCourseSet.setDrawValues(false);
mCourseSet.setLineWidth(2f);
mLoadSet = new LineDataSet(mLoadEntry, "运动负荷");
mLoadSet.setAxisDependency(YAxis.AxisDependency.LEFT);
mLoadSet.setColor(Color.parseColor("#1890FF"));
mLoadSet.setDrawCircles(false);
mLoadSet.setDrawValues(false);
mLoadSet.setLineWidth(2f);
mRateSet = new LineDataSet(mRateEntry, "完成率");
mRateSet.setAxisDependency(YAxis.AxisDependency.RIGHT);
mRateSet.setColor(Color.parseColor("#9013FE"));
mRateSet.setDrawCircles(false);
mRateSet.setDrawValues(false);
mRateSet.setLineWidth(2f);
LineData lineData = new LineData(mCourseSet, mLoadSet, mRateSet);
schoolChart.setData(lineData);
schoolChart.invalidate();
//柱状图
mGradeSet = new BarDataSet(mGradeEntry, "");
mGradeSet.setColor(lineColor);
mGradeSet.setDrawValues(false);
mGradeSet.setAxisDependency(YAxis.AxisDependency.LEFT);
mClassSet = new BarDataSet(mClassEntry, "");
mClassSet.setColor(lineColor);
mClassSet.setDrawValues(false);
mClassSet.setAxisDependency(YAxis.AxisDependency.LEFT);
BarData gradeData = new BarData(mGradeSet);
gradeData.setBarWidth(0.6f);
gradeChart.setData(gradeData);
gradeChart.invalidate();
BarData classData = new BarData(mClassSet);
classData.setBarWidth(0.6f);
classChart.setData(classData);
classChart.invalidate();
}
@OnClick({R.id.ib_bar_back, R.id.rb_last, R.id.rb_current})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.ib_bar_back:
finish();
break;
case R.id.rb_last:
break;
case R.id.rb_current:
break;
default:
}
}
}
package com.jimind.sportdemo;
import android.content.Intent;
import android.graphics.Color;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.TextView;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.jimind.sportdemo.adapter.BillAdapter;
import com.jimind.sportdemo.api.ApiManager;
import com.jimind.sportdemo.base.BaseActivity;
import com.jimind.sportdemo.base.BaseObserver;
import com.jimind.sportdemo.base.ResponseResult;
import com.jimind.sportdemo.bean.Bill;
import com.jimind.sportdemo.bean.Course;
import com.jimind.sportdemo.utils.AppManager;
import com.jimind.sportdemo.utils.CommonUtils;
import com.jimind.sportdemo.utils.Constant;
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import io.reactivex.schedulers.Schedulers;
/**
* 课程总结
*
* @author Any
*/
public class SummaryActivity extends BaseActivity {
@BindView(R.id.tv_title_label)
TextView tvTitleLabel;
@BindView(R.id.tv_class_course)
TextView tvClassCourse;
@BindView(R.id.tv_summary_density)
TextView tvSummaryDensity;
@BindView(R.id.tv_summary_strength)
TextView tvSummaryStrength;
@BindView(R.id.tv_summary_rate)
TextView tvSummaryRate;
@BindView(R.id.tv_remark)
TextView tvRemark;
@BindView(R.id.chart_hear_beat)
LineChart heartBeatChart;
@BindView(R.id.rlv_bill)
RecyclerView rlvBill;
private BillAdapter mBillAdapter;
private LineDataSet mStepSet, mHeartSet;
private List<Entry> mStepEntry = new ArrayList<>(), mHeartEntry = new ArrayList<>();
@Override
protected int getLayoutResource() {
return R.layout.activity_summary;
}
@Override
protected void initView() {
CommonUtils.initTitle(this, tvTitleLabel);
int textColor = ContextCompat.getColor(this, R.color.lengendColor);
rlvBill.setLayoutManager(new LinearLayoutManager(this));
mBillAdapter = new BillAdapter(this);
rlvBill.setAdapter(mBillAdapter);
//设置图表参数
heartBeatChart.getDescription().setEnabled(false);
heartBeatChart.setDoubleTapToZoomEnabled(false);
heartBeatChart.getLegend().setEnabled(true);
heartBeatChart.setTouchEnabled(false);
heartBeatChart.setExtraOffsets(30f, 0f, 30f, 20f);
Legend legend = heartBeatChart.getLegend();
legend.setTextSize(12f);
legend.setTextColor(textColor);
legend.setForm(Legend.LegendForm.LINE);
legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
final XAxis xAxis = heartBeatChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setTextColor(textColor);
xAxis.setTextSize(12f);
xAxis.setDrawGridLines(false);
xAxis.setLabelCount(6, true);
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
int xValue = (int) value;
if (xValue >= 0 && xValue < 6) {
return String.valueOf(xValue * 10 + 10) + "分钟";
}
return null;
}
});
YAxis rightAxis = heartBeatChart.getAxisRight();
rightAxis.setTextColor(textColor);
rightAxis.setTextSize(12f);
rightAxis.setDrawGridLines(true);
rightAxis.setDrawAxisLine(false);
rightAxis.setAxisMinimum(40f);
rightAxis.setAxisMaximum(180f);
rightAxis.setLabelCount(8, true);
rightAxis.enableGridDashedLine(5f, 5f, 0);
YAxis leftAxis = heartBeatChart.getAxisLeft();
leftAxis.setTextColor(textColor);
leftAxis.setTextSize(12f);
leftAxis.setDrawGridLines(false);
leftAxis.setDrawAxisLine(false);
leftAxis.setAxisMinimum(200f);
leftAxis.setAxisMaximum(1600f);
leftAxis.setLabelCount(8, true);
}
@Override
protected void initData() {
Intent intent = this.getIntent();
String className = intent.getStringExtra(Constant.CLASS_NAME);
int totalNumber = intent.getIntExtra(Constant.TOTAL_NUMBER, 0);
Course course = (Course) intent.getSerializableExtra(Constant.COURSE);
String gradeClass = course.getGradeName() + className;
String teacherName = MyApplication.getInstance().getTeacherName();
tvClassCourse.setText("年级班级:" + gradeClass + "\t课程:" + course.getCourseName());
tvRemark.setText("老师:" + teacherName + "\t人数:" + totalNumber + "人\t时间: 40分钟");
int lineColor = ContextCompat.getColor(this, R.color.highLightColor);
List<Bill> billList = new ArrayList<>();
for (int i = 0; i < 20; i++) {
Bill bill = new Bill();
bill.setName("王明");
bill.setLoad("1.7");
bill.setDensity("60%");
billList.add(bill);
}
mBillAdapter.setDataList(billList);
for (int i = 0; i < 6; i++) {
float val1 = (float) (Math.random() * 100 + 40);
float val2 = (float) (Math.random() * 1000);
mHeartEntry.add(new Entry(i, val1));
mStepEntry.add(new Entry(i, val2));
}
mStepSet = new LineDataSet(mStepEntry, "步数");
mStepSet.setAxisDependency(YAxis.AxisDependency.LEFT);
mStepSet.setColor(lineColor);
mStepSet.setDrawCircles(false);
mStepSet.setDrawValues(false);
mStepSet.setLineWidth(2f);
mHeartSet = new LineDataSet(mHeartEntry, "心跳");
mHeartSet.setAxisDependency(YAxis.AxisDependency.RIGHT);
mHeartSet.setColor(Color.parseColor("#9013FE"));
mHeartSet.setDrawCircles(false);
mHeartSet.setDrawValues(false);
mHeartSet.setLineWidth(2f);
LineData lineData = new LineData(mStepSet, mHeartSet);
heartBeatChart.setData(lineData);
heartBeatChart.invalidate();
}
@OnClick(R.id.bt_over)
public void onClick() {
try {
CourseDescActivity.mActivity.finish();
} catch (ConcurrentModificationException e) {
e.printStackTrace();
}
finish();
sendToService();
}
/**
* 传给服务器
*/
private void sendToService() {
ApiManager.getInstance().requestService
.sendCommand(Constant.RETURN, "", "")
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(new BaseObserver<ResponseResult>() {
@Override
protected void onSuccess(ResponseResult responseResult) {
}
@Override
protected void onFailure(int code, String message) {
}
});
}
}
package com.jimind.sportdemo.adapter;
import android.content.Context;
import android.graphics.Color;
import android.support.constraint.ConstraintLayout;
import android.widget.TextView;
import com.jimind.sportdemo.R;
import com.jimind.sportdemo.base.BaseRecyclerAdapter;
import com.jimind.sportdemo.base.BaseViewHolder;
import com.jimind.sportdemo.bean.Bill;
/**
* 学生排行榜
*
* @author Any
*/
public class BillAdapter extends BaseRecyclerAdapter<Bill> {
private int backgroundColor;
public BillAdapter(Context context) {
super(context);
backgroundColor = Color.parseColor("#19000000");
}
@Override
protected int getLayoutId() {
return R.layout.item_bill;
}
@Override
protected void onBindItemHolder(BaseViewHolder holder, int position) {
ConstraintLayout clBill = holder.getView(R.id.cl_bill);
TextView tvStudentBill = holder.getView(R.id.tv_student_bill);
TextView tvStudentName = holder.getView(R.id.tv_student_name);
TextView tvStudentLoad = holder.getView(R.id.tv_student_load);
TextView tvStudentDensity = holder.getView(R.id.tv_student_density);
Bill bill = mDataList.get(position);
if (position % 2 == 0) {
clBill.setBackgroundColor(backgroundColor);
}
tvStudentBill.setText(String.valueOf(position + 1));
tvStudentName.setText(bill.getName());
tvStudentLoad.setText(bill.getLoad());
tvStudentDensity.setText(bill.getDensity());
}
}
package com.jimind.sportdemo.adapter;
import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.jimind.sportdemo.MyApplication;
import com.jimind.sportdemo.R;
import com.jimind.sportdemo.base.BaseRecyclerAdapter;
import com.jimind.sportdemo.base.BaseViewHolder;
import com.jimind.sportdemo.bean.Course;
import com.jimind.sportdemo.listener.MyClickListener;
import com.jimind.sportdemo.utils.CommonUtils;
import com.jimind.sportdemo.utils.Constant;
import com.jimind.sportdemo.utils.GlideApp;
/**
* 课程列表
*
* @author Any
*/
public class CourseAdapter extends BaseRecyclerAdapter<Course> {
private MyClickListener mListener;
public CourseAdapter(Context context) {
super(context);
mListener = (MyClickListener) mContext;
}
@Override
protected int getLayoutId() {
return R.layout.item_course_list;
}
@Override
protected void onBindItemHolder(final BaseViewHolder holder, final int position) {
ImageView ivCourse = holder.getView(R.id.iv_course);
TextView tvGrade = holder.getView(R.id.tv_grade);
TextView tvCourseName = holder.getView(R.id.tv_course_china);
ProgressBar progressBar = holder.getView(R.id.pb_little_star);
final Course course = mDataList.get(position);
tvGrade.setText(course.getGradeName());
tvCourseName.setText(course.getCourseName());
progressBar.setProgress(course.getDifficultyLevel() * CommonUtils.dip2px(mContext, 8));
GlideApp
.with(mContext)
.load(Constant.LABEL+MyApplication.getInstance().getHost()
+Constant.RESOURCE_PORT + course.getCourseListUrl())
.into(ivCourse);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.click(holder.getAdapterPosition());
}
});
}
}
package com.jimind.sportdemo.adapter;
import android.content.Context;
import android.view.View;
import android.widget.TextView;
import com.jimind.sportdemo.listener.PopupListener;
import com.jimind.sportdemo.R;
import com.jimind.sportdemo.base.BaseRecyclerAdapter;
import com.jimind.sportdemo.base.BaseViewHolder;
/**
* 弹出框
*
* @author Any
*/
public class PopupAdapter extends BaseRecyclerAdapter<String> {
private PopupListener mListener;
public PopupAdapter(Context context) {
super(context);
mListener = (PopupListener) mContext;
}
@Override
protected int getLayoutId() {
return R.layout.item_popup;
}
@Override
protected void onBindItemHolder(final BaseViewHolder holder, final int position) {
final TextView tvContent = holder.getView(R.id.tv_content);
tvContent.setText(mDataList.get(position));
tvContent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.click(mDataList.get(holder.getAdapterPosition()));
}
});
}
}
package com.jimind.sportdemo.adapter;
import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.jimind.sportdemo.MyApplication;
import com.jimind.sportdemo.R;
import com.jimind.sportdemo.base.BaseRecyclerAdapter;
import com.jimind.sportdemo.base.BaseViewHolder;
import com.jimind.sportdemo.bean.Section;
import com.jimind.sportdemo.listener.MyClickListener;
import com.jimind.sportdemo.utils.Constant;
import com.jimind.sportdemo.utils.GlideApp;
import com.jimind.sportdemo.utils.TimeFormatUtils;
/**
* 课程详情
*
* @author Any
*/
public class SectionAdapter extends BaseRecyclerAdapter<Section> {
private MyClickListener mListener;
public SectionAdapter(Context context) {
super(context);
mListener = (MyClickListener) mContext;
}
@Override
protected int getLayoutId() {
return R.layout.item_course_desc;
}
@Override
protected void onBindItemHolder(final BaseViewHolder holder, final int position) {
ImageView ivSection = holder.getView(R.id.iv_section);
TextView tvSectionTitle = holder.getView(R.id.tv_section_title);
TextView tvSectionDuration = holder.getView(R.id.tv_section_duration);
final Section section = mDataList.get(position);
GlideApp.with(mContext)
.load(Constant.LABEL+MyApplication.getInstance().getHost()
+ Constant.RESOURCE_PORT + section.getSectionUrl())
.into(ivSection);
tvSectionTitle.setText(section.getSectionName());
tvSectionDuration.setText(TimeFormatUtils.formatSeconds(section.getSectionDuration()));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.click(holder.getAdapterPosition());
}
});
}
}
package com.jimind.sportdemo.adapter;
import android.content.Context;
import android.graphics.Color;
import android.support.constraint.ConstraintLayout;
import android.widget.TextView;
import com.jimind.sportdemo.R;
import com.jimind.sportdemo.base.BaseRecyclerAdapter;
import com.jimind.sportdemo.base.BaseViewHolder;
import com.jimind.sportdemo.bean.Bill;
/**
* 老师课时
*
* @author Any
*/
public class TeacherAdapter extends BaseRecyclerAdapter<Bill> {
private int backgroundColor;
public TeacherAdapter(Context context) {
super(context);
backgroundColor = Color.parseColor("#19000000");
}
@Override
protected int getLayoutId() {
return R.layout.item_teacher;
}
@Override
protected void onBindItemHolder(BaseViewHolder holder, int position) {
ConstraintLayout clBill = holder.getView(R.id.cl_teacher);
TextView tvTeacherBill = holder.getView(R.id.tv_teacher_bill);
TextView tvTeacherName = holder.getView(R.id.tv_teacher_name);
TextView tvCourseHour = holder.getView(R.id.tv_teacher_hour);
TextView tvTeacherLoad = holder.getView(R.id.tv_teacher_load);
TextView tvTeacherDensity = holder.getView(R.id.tv_teacher_density);
Bill bill = mDataList.get(position);
if (position % 2 == 0) {
clBill.setBackgroundColor(backgroundColor);
}
tvTeacherBill.setText(String.valueOf(position + 1));
tvTeacherName.setText(bill.getName());
tvCourseHour.setText("4");
tvTeacherLoad.setText(bill.getLoad());
tvTeacherDensity.setText(bill.getDensity());
}
}
package com.jimind.sportdemo.api;
import com.jimind.sportdemo.MyApplication;
import com.jimind.sportdemo.utils.Constant;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* api
*
* @author Any
*/
public class ApiManager {
public RequestService requestService;
private static ApiManager apiManager;
/**
* 初始化
*/
private ApiManager() {
//日志拦截器
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.addInterceptor(logInterceptor);
OkHttpClient client = builder.build();
requestService = new Retrofit.Builder()
.client(client)
.baseUrl(Constant.LABEL+MyApplication.getInstance().getHost() +Constant.API_PORT)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(RequestService.class);
}
/**
* 单例
*
* @return
*/
public static ApiManager getInstance() {
if (apiManager == null) {
synchronized (ApiManager.class) {
if (apiManager == null) {
apiManager = new ApiManager();
}
}
}
return apiManager;
}
}
package com.jimind.sportdemo.api;
import com.jimind.sportdemo.base.ResponseResult;
import io.reactivex.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;
/**
* request api
*
* @author Any
*/
public interface RequestService {
/**
* 启动播放
*
* @param type
* @param v1
* @param v2
* @return
*/
@GET("Command?")
Observable<ResponseResult> sendCommand(@Query("type") String type,
@Query("v1") String v1,
@Query("v2") String v2);
}
package com.jimind.sportdemo.base;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import butterknife.ButterKnife;
import butterknife.Unbinder;
/**
* Activity基类
*
* @author Any
*/
public abstract class BaseActivity extends AppCompatActivity {
private Unbinder bind;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutResource());
bind = ButterKnife.bind(this);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//屏幕常亮
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
initStatusBar();
initView();
initData();
}
/**
* 获取布局资源ID
*
* @return
*/
protected abstract int getLayoutResource();
/**
* 初始化布局
*/
protected abstract void initView();
/**
* 初始化数据
*/
protected void initData() {
}
/**
* 初始化沉浸式状态栏
*/
private void initStatusBar() {
Window window = getWindow();
//5.0版本及以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
View decorView = window.getDecorView();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//4.4版本及以上,5.0以下
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
@Override
protected void onDestroy() {
bind.unbind();
super.onDestroy();
}
}
package com.jimind.sportdemo.base;
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.LinkedList;
import java.util.List;
/**
* ListView的通用适配器
*
* @param <T>
* @author Any
*/
public abstract class BaseListAdapter<T> extends android.widget.BaseAdapter {
protected final Context mContext;
private LayoutInflater mInflater;
private List<T> mData = new LinkedList<>();
protected BaseListAdapter(Context context) {
mContext=context;
mInflater = LayoutInflater.from(context);
}
@Override
final public int getCount() {
return mData.size();
}
@Override
final public T getItem(int position) {
return mData.get(position);
}
/**
* 设置数据
*/
final public void setData(List<T> data, boolean reset) {
if (reset) {
mData.clear();
}
if (data != null) {
mData.addAll(data);
}
notifyDataSetChanged();
}
@Override
final public long getItemId(int position) {
return position;
}
@Override
final public View getView(int position, View convertView, ViewGroup parent) {
int itemViewType = getItemViewType(position);
T item = getItem(position);
ViewHolder holder;
boolean reused = false;
if (convertView == null) {
int itemLayoutId = getItemLayoutId(itemViewType);
convertView = mInflater.inflate(itemLayoutId, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
reused = true;
holder = (ViewHolder) convertView.getTag();
}
handleItem(itemViewType, position, item, holder, reused);
return convertView;
}
/**
* 返回视图类型
*
* @param itemViewType 视图类型
* @return 布局id
*/
protected abstract int getItemLayoutId(int itemViewType);
/**
* 处理item,主要是填充数据
*
* @param itemViewType item对应的视图类型
* @param position 实体对应的索引位置
* @param item 具体实体
* @param holder holder
* @param reused reused
*/
protected abstract void handleItem(int itemViewType, int position, T item, ViewHolder holder, boolean reused);
protected static class ViewHolder {
private View mItemLayout;
SparseArray<View> mViews = new SparseArray<>();
protected ViewHolder(View itemLayout) {
mItemLayout = itemLayout;
}
public View getItemLayout() {
return mItemLayout;
}
public <T extends View> T get(int viewId) {
View childView = mViews.get(viewId);
if (childView == null) {
childView = mItemLayout.findViewById(viewId);
mViews.put(viewId, childView);
}
return (T) childView;
}
public <T extends View> T get(int viewId, Class<T> viewClass) {
View childView = mViews.get(viewId);
if (childView == null) {
childView = mItemLayout.findViewById(viewId);
mViews.put(viewId, childView);
}
return (T) childView;
}
}
}
package com.jimind.sportdemo.base;
import android.util.MalformedJsonException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.exceptions.CompositeException;
/**
* 观察者基类
*
* @param <T>
* @author Any
*/
public abstract class BaseObserver<T> implements Observer<T> {
private Disposable disposable;
private static final int CODE_TIMEOUT = 1000;
private static final int CODE_UNCONNECTED = 1001;
private static final int CODE_JSON = 1020;
private static final int CODE_DEFAULT = 1003;
private static final String CONNECT_EXCEPTION = "网络出现了些许小问题,请检查网络连接";
private static final String SOCKET_TIMEOUT_EXCEPTION = "网络连接超时,请检查您的网络状态,稍后重试";
private static final String MALFORMED_JSON_EXCEPTION = "数据解析错误";
@Override
public void onSubscribe(Disposable d) {
disposable = d;
}
@Override
public void onNext(T t) {
onSuccess(t);
}
@Override
public void onError(Throwable e) {
if (e instanceof CompositeException) {
CompositeException compositeE = (CompositeException) e;
for (Throwable throwable : compositeE.getExceptions()) {
if (throwable instanceof SocketTimeoutException) {
onFailure(CODE_TIMEOUT, SOCKET_TIMEOUT_EXCEPTION);
} else if (throwable instanceof ConnectException) {
onFailure(CODE_UNCONNECTED, CONNECT_EXCEPTION);
} else if (throwable instanceof UnknownHostException) {
onFailure(CODE_UNCONNECTED, CONNECT_EXCEPTION);
} else if (throwable instanceof MalformedJsonException) {
onFailure(CODE_JSON, MALFORMED_JSON_EXCEPTION);
}
}
} else {
onFailure(CODE_DEFAULT, e.getMessage());
}
close();
}
@Override
public void onComplete() {
close();
}
private void close() {
if (disposable != null && !disposable.isDisposed()) {
disposable.dispose();
disposable = null;
}
}
/**
* 请求成功
*
* @param t
*/
protected abstract void onSuccess(T t);
/**
* 请求失败
*
* @param code
* @param message
*/
protected abstract void onFailure(int code, String message);
}
package com.jimind.sportdemo.base;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* RecyclerView 的通用适配器基类
*
* @author Any
*/
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {
protected Context mContext;
private LayoutInflater mInflater;
protected List<T> mDataList = new ArrayList<>();
protected BaseRecyclerAdapter(Context context) {
mContext = context;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@NonNull
@Override
public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = mInflater.inflate(getLayoutId(), parent, false);
return new BaseViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
onBindItemHolder(holder, holder.getAdapterPosition());
}
/**
* 局部刷新关键:带payload的这个onBindViewHolder方法必须实现
*
* @param holder
* @param position
* @param payloads
*/
@Override
public void onBindViewHolder(@NonNull BaseViewHolder holder, int position, @NonNull List<Object> payloads) {
if (payloads.isEmpty()) {
onBindViewHolder(holder, position);
} else {
onBindItemHolder(holder, position, payloads);
}
}
/**
* 获取布局资源ID
*
* @return
*/
protected abstract int getLayoutId();
/**
* 绑定数据
*
* @param holder
* @param position
*/
protected abstract void onBindItemHolder(BaseViewHolder holder, int position);
private void onBindItemHolder(BaseViewHolder holder, int position, List<Object> payloads) {
}
@Override
public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
mDataList.clear();
mDataList = null;
}
@Override
public int getItemCount() {
return mDataList.size();
}
public List<T> getDataList() {
return mDataList;
}
public void setDataList(Collection<T> list) {
this.mDataList.clear();
this.mDataList.addAll(list);
notifyDataSetChanged();
}
public void addAll(Collection<T> list) {
int lastIndex = this.mDataList.size();
if (this.mDataList.addAll(list)) {
notifyItemRangeInserted(lastIndex, list.size());
}
}
public void remove(int position) {
this.mDataList.remove(position);
notifyItemRemoved(position);
if (position != (getDataList().size())) {
// 如果移除的是最后一个,忽略
notifyItemRangeChanged(position, this.mDataList.size() - position);
}
}
public void clear() {
mDataList.clear();
notifyDataSetChanged();
}
}
package com.jimind.sportdemo.base;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
/**
* 普通item的holder
*
* @author Any
*/
public class BaseViewHolder extends RecyclerView.ViewHolder {
private View mItemView;
private SparseArray<View> views;
public BaseViewHolder(View itemView) {
super(itemView);
this.mItemView=itemView;
this.views = new SparseArray<>();
}
@SuppressWarnings("unchecked")
public <T extends View> T getView(int viewId) {
View view = views.get(viewId);
if (view == null) {
view = mItemView.findViewById(viewId);
views.put(viewId, view);
}
return (T) view;
}
}
package com.jimind.sportdemo.base;
/**
* 服务器返回结果
* @author Any
*/
public class ResponseResult {
/**
* type : FromBeginPlay
* status : false
* msg : 404错误
*/
private String type;
private String status;
private String msg;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
package com.jimind.sportdemo.bean;
/**
* 排行榜
*
* @author Any
*/
public class Bill {
private String name;
private String load;
private String density;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLoad() {
return load;
}
public void setLoad(String load) {
this.load = load;
}
public String getDensity() {
return density;
}
public void setDensity(String density) {
this.density = density;
}
}
package com.jimind.sportdemo.bean;
import java.io.Serializable;
/**
* 课程
*
* @author Any
*/
public class Course implements Serializable {
private int courseId;
private String courseName;
private String courseListUrl;
private String courseDescUrl;
private String courseDescribe;
private String gradeName;
private int difficultyLevel;
public int getCourseId() {
return courseId;
}
public void setCourseId(int courseId) {
this.courseId = courseId;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCourseListUrl() {
return courseListUrl;
}
public void setCourseListUrl(String courseListUrl) {
this.courseListUrl = courseListUrl;
}
public String getCourseDescUrl() {
return courseDescUrl;
}
public void setCourseDescUrl(String courseDescUrl) {
this.courseDescUrl = courseDescUrl;
}
public String getCourseDescribe() {
return courseDescribe;
}
public void setCourseDescribe(String courseDescribe) {
this.courseDescribe = courseDescribe;
}
public String getGradeName() {
return gradeName;
}
public void setGradeName(String gradeName) {
this.gradeName = gradeName;
}
public int getDifficultyLevel() {
return difficultyLevel;
}
public void setDifficultyLevel(int difficultyLevel) {
this.difficultyLevel = difficultyLevel;
}
}
package com.jimind.sportdemo.bean;
/**
* 课程小节
*
* @author Any
*/
public class Section {
private String sectionId;
private String sectionName;
private String sectionDescribe;
private String sectionUrl;
private int sectionDuration;
private String resourceUrl;
private int resourceDuration;
private int resourceType;
public String getSectionId() {
return sectionId;
}
public void setSectionId(String sectionId) {
this.sectionId = sectionId;
}
public String getSectionName() {
return sectionName;
}
public void setSectionName(String sectionName) {
this.sectionName = sectionName;
}
public String getSectionDescribe() {
return sectionDescribe;
}
public void setSectionDescribe(String sectionDescribe) {
this.sectionDescribe = sectionDescribe;
}
public String getSectionUrl() {
return sectionUrl;
}
public void setSectionUrl(String sectionUrl) {
this.sectionUrl = sectionUrl;
}
public int getSectionDuration() {
return sectionDuration;
}
public void setSectionDuration(int sectionDuration) {
this.sectionDuration = sectionDuration;
}
public String getResourceUrl() {
return resourceUrl;
}
public void setResourceUrl(String resourceUrl) {
this.resourceUrl = resourceUrl;
}
public int getResourceDuration() {
return resourceDuration;
}
public void setResourceDuration(int resourceDuration) {
this.resourceDuration = resourceDuration;
}
public int getResourceType() {
return resourceType;
}
public void setResourceType(int resourceType) {
this.resourceType = resourceType;
}
}
package com.jimind.sportdemo.factory;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 线程池代理
*
* @author Any
*/
public class ThreadPoolProxy {
private ThreadPoolExecutor mExecutor;
private int mCorePoolSize, mMaximumPoolSize;
/**
* @param corePoolSize 核心池的大小
* @param maximumPoolSize 最大线程数
*/
public ThreadPoolProxy(int corePoolSize, int maximumPoolSize) {
mCorePoolSize = corePoolSize;
mMaximumPoolSize = maximumPoolSize;
initThreadPoolExecutor();
}
/**
* 初始化ThreadPoolExecutor
* 双重检查加锁,只有在第一次实例化的时候才启用同步机制,提高了性能
*/
private void initThreadPoolExecutor() {
if (mExecutor == null || mExecutor.isShutdown() || mExecutor.isTerminated()) {
synchronized (ThreadPoolProxy.class) {
if (mExecutor == null || mExecutor.isShutdown() || mExecutor.isTerminated()) {
long keepAliveTime = 5000;
TimeUnit unit = TimeUnit.MILLISECONDS;
LinkedBlockingDeque<Runnable> queue = new LinkedBlockingDeque<>();
ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();
mExecutor = new ThreadPoolExecutor(mCorePoolSize, mMaximumPoolSize, keepAliveTime, unit, queue,
threadFactory, handler);
}
}
}
}
/**
* 执行任务
* <p>
* 执行任务和提交任务的区别?
* 1.有无返回值
* execute->没有返回值
* submit-->有返回值
* 2.Future的具体作用?
* 1.有方法可以接收一个任务执行完成之后的结果,其实就是get方法,get方法是一个阻塞方法
* 2.get方法的签名抛出了异常===>可以处理任务执行过程中可能遇到的异常
*/
public void execute(Runnable task) {
mExecutor.execute(task);
}
/**
* 提交任务
*/
public Future submit(Runnable task) {
return mExecutor.submit(task);
}
/**
* 移除任务
*/
public void remove(Runnable task) {
mExecutor.remove(task);
}
}
package com.jimind.sportdemo.factory;
/**
* 线程池代理工厂
*
* @author Any
*/
public class ThreadPoolProxyFactory {
private static ThreadPoolProxy mNormalThreadPoolProxy;
private static ThreadPoolProxy mDownLoadThreadPoolProxy;
/**
* 得到普通线程池代理对象mNormalThreadPoolProxy
*/
public static ThreadPoolProxy getNormalThreadPoolProxy() {
if (mNormalThreadPoolProxy == null) {
synchronized (ThreadPoolProxyFactory.class) {
if (mNormalThreadPoolProxy == null) {
mNormalThreadPoolProxy = new ThreadPoolProxy(5, 5);
}
}
}
return mNormalThreadPoolProxy;
}
/**
* 得到下载线程池代理对象mDownLoadThreadPoolProxy
*/
public static ThreadPoolProxy getDownLoadThreadPoolProxy() {
if (mDownLoadThreadPoolProxy == null) {
synchronized (ThreadPoolProxyFactory.class) {
if (mDownLoadThreadPoolProxy == null) {
mDownLoadThreadPoolProxy = new ThreadPoolProxy(3, 3);
}
}
}
return mDownLoadThreadPoolProxy;
}
}
package com.jimind.sportdemo.listener;
/**
* 点击接口
*
* @author Any
*/
public interface MyClickListener {
/**
* 点击事件
* @param position
*/
void click(int position);
}
\ No newline at end of file
package com.jimind.sportdemo.listener;
/**
* 点击接口
*
* @author Any
*/
public interface PopupListener {
/**
* 点击事件
*
* @param content
*/
void click(String content);
}
\ No newline at end of file
package com.jimind.sportdemo.utils;
import android.app.Activity;
import android.content.Context;
import java.util.Stack;
/**
* 应用程序Activity管理类:用于Activity管理和应用程序退出
*/
public class AppManager {
private static Stack<Activity> activityStack;
private static AppManager instance;
private AppManager() {
}
/**
* 单一实例
*/
public static AppManager getAppManager() {
if (instance == null) {
instance = new AppManager();
}
return instance;
}
/**
* 添加Activity到堆栈
*/
public void addActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.add(activity);
}
/**
* 获取当前Activity(堆栈中最后一个压入的)
*/
public Activity currentActivity() {
Activity activity = activityStack.lastElement();
return activity;
}
/**
* 结束当前Activity(堆栈中最后一个压入的)
*/
public void finishActivity() {
Activity activity = activityStack.lastElement();
finishActivity(activity);
}
/**
* 结束指定的Activity
*/
public void finishActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}
/**
* 结束指定类名的Activity
*/
public void finishActivity(Class<?> cls) {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
finishActivity(activity);
}
}
}
/**
* 结束所有Activity
*/
public void finishAllActivity() {
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (null != activityStack.get(i)) {
activityStack.get(i).finish();
}
}
activityStack.clear();
}
/**
* 退出应用程序
*/
public void AppExit(Context context) {
try {
finishAllActivity();
System.exit(0);
android.os.Process.killProcess(android.os.Process.myPid());
} catch (Exception e) {
}
}
/**
* 结束指定的Activity
*/
public void getActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}
/**
* 得到指定类名的Activity
*/
public Activity getActivity(Class<?> cls) {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
return activity;
}
}
return null;
}
}
package com.jimind.sportdemo.utils;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import java.text.DecimalFormat;
/**
* 常用工具类
*
* @author Any
*/
public class CommonUtils {
/**
* 初始化title高度
*
* @param layout
*/
public static void initTitleBar(Context context, ViewGroup layout){
ViewGroup.LayoutParams layoutParams = layout.getLayoutParams();
int height = CommonUtils.getStatusHeight(context);
layoutParams.height = height + CommonUtils.dip2px(context, 60);
layout.setLayoutParams(layoutParams);
layout.setPadding(0,height,0,0);
}
/**
* 初始化title高度
*
* @param view
*/
public static void initTitle(Context context, View view){
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
int height = CommonUtils.getStatusHeight(context);
layoutParams.height = height + CommonUtils.dip2px(context, 60);
view.setLayoutParams(layoutParams);
view.setPadding(0,height,0,0);
}
/**
* 利用反射获取状态栏高度+标题栏高度
*
* @return
*/
public static int getStatusHeight(Context context) {
int result = 0;
//获取状态栏高度的资源id
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
/**
* dp转成px
*
* @param context
* @param dipValue
* @return
*/
public static int dip2px(Context context, float dipValue) {
float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
public static int px2dip(Context context, float pxValue) {
float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 显示软键盘
*
* @param context
* @param mEditText
*/
public static void showKeyBoard(Context context, EditText mEditText) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditText, InputMethodManager.RESULT_SHOWN);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
}
/**
* 隐藏软键盘
*
* @param context
* @param view
*/
public static void hideSoftKeyboard(Context context, View view) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.hideSoftInputFromWindow(view.getApplicationWindowToken(), 0);
}
}
/**
* 获得屏幕高度
*
* @param context
* @return
*/
public static int getScreenWidth(Context context) {
return context.getResources().getDisplayMetrics().widthPixels;
}
/**
* 获得屏幕宽度
*
* @param context
* @return
*/
public static int getScreenHeight(Context context) {
return context.getResources().getDisplayMetrics().heightPixels;
}
/**
* 保留两位小数
*
* @param number double
* @return String类型的两位小数
*/
public static String setDoubleTwo(double number) {
DecimalFormat df = new DecimalFormat("0.00");
return df.format(number);
}
}
package com.jimind.sportdemo.utils;
public class Constant {
/**
* API接口
*/
public static final String HOST = "http://192.168.2.159";
/**
* 共享资源
*/
public static final String LABEL="http://";
public static final String API_PORT = ":8024/";
public static final String RESOURCE_PORT = ":8023";
public static final String GRADE = "年级";
public static final String CLASS = "班级";
/**
* 参数传递
*/
public static String COURSE="course";
public static String CLASS_NAME="class_name";
public static String TOTAL_NUMBER="total_number";
/**
* 语音指令
*/
public static final String START = "启动课程";
public static final String PLAY = "播放";
public static final String PAUSE = "暂停";
public static final String RESTART = "重播视频";
public static final String INCREASE_VOLUME = "增大音量";
public static final String DECREASE_VOLUME = "减小音量";
public static final String INCREASE_LIGHT = "增大亮度";
public static final String DECREASE_LIGHT = "减小亮度";
/**
* 服务器指令
*/
public static final String BEGIN="FromBeginPlay";
public static final String SUSPEND="Suspend";
public static final String CONTINUE="ContinuePlay";
public static final String VOLUME="Volume";
public static final String START_COURSE="BeginCourse";
public static final String STOP_COURSE="EndCourse";
public static final String CHECK_COURSE= "CheckCourse";
public static final String SIGN="Signin";
public static final String RETURN= "ReturnHome";
}
package com.jimind.sportdemo.utils;
import android.support.annotation.NonNull;
import java.text.FieldPosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
/**
* 动态时间格式化
*
* @author Any
*/
public class DynamicTimeFormat extends SimpleDateFormat {
private static Locale mLocale = Locale.CHINA;
private static String[] mWeeks = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};
private static String[] mMoments = {"中午", "凌晨", "早上", "下午", "晚上"};
private String mFormat = "%s";
public DynamicTimeFormat() {
this("%s", "yyyy年", "M月d日", "HH:mm");
}
public DynamicTimeFormat(String format) {
this();
this.mFormat = format;
}
public DynamicTimeFormat(String yearFormat, String dateFormat, String timeFormat) {
super(String.format(mLocale, "%s %s %s", yearFormat, dateFormat, timeFormat), mLocale);
}
public DynamicTimeFormat(String format, String yearFormat, String dateFormat, String timeFormat) {
this(yearFormat, dateFormat, timeFormat);
this.mFormat = format;
}
@Override
public StringBuffer format(@NonNull Date date, @NonNull StringBuffer toAppendTo, @NonNull FieldPosition pos) {
toAppendTo = super.format(date, toAppendTo, pos);
Calendar otherCalendar = calendar;
Calendar todayCalendar = Calendar.getInstance();
int hour = otherCalendar.get(Calendar.HOUR_OF_DAY);
String[] times = toAppendTo.toString().split(" ");
String moment = hour == 12 ? mMoments[0] : mMoments[hour / 6 + 1];
String timeFormat = moment + " " + times[2];
String dateFormat = times[1] + " " + timeFormat;
String yearFormat = times[0] + dateFormat;
toAppendTo.delete(0, toAppendTo.length());
boolean yearTemp = todayCalendar.get(Calendar.YEAR) == otherCalendar.get(Calendar.YEAR);
if (yearTemp) {
int todayMonth = todayCalendar.get(Calendar.MONTH);
int otherMonth = otherCalendar.get(Calendar.MONTH);
if (todayMonth == otherMonth) {
//表示是同一个月
int temp = todayCalendar.get(Calendar.DATE) - otherCalendar.get(Calendar.DATE);
switch (temp) {
case 0:
toAppendTo.append(timeFormat);
break;
case 1:
toAppendTo.append("昨天 ");
toAppendTo.append(timeFormat);
break;
case 2:
toAppendTo.append("前天 ");
toAppendTo.append(timeFormat);
break;
case 3:
case 4:
case 5:
case 6:
int dayOfMonth = otherCalendar.get(Calendar.WEEK_OF_MONTH);
int todayOfMonth = todayCalendar.get(Calendar.WEEK_OF_MONTH);
if (dayOfMonth == todayOfMonth) {
//表示是同一周
int dayOfWeek = otherCalendar.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek != 1) {
//判断当前是不是星期日 如想显示为:周日 12:09 可去掉此判断
toAppendTo.append(mWeeks[otherCalendar.get(Calendar.DAY_OF_WEEK) - 1]);
toAppendTo.append(' ');
toAppendTo.append(timeFormat);
} else {
toAppendTo.append(dateFormat);
}
} else {
toAppendTo.append(dateFormat);
}
break;
default:
toAppendTo.append(dateFormat);
break;
}
} else {
toAppendTo.append(dateFormat);
}
} else {
toAppendTo.append(yearFormat);
}
int length = toAppendTo.length();
toAppendTo.append(String.format(mLocale, mFormat, toAppendTo.toString()));
toAppendTo.delete(0, length);
return toAppendTo;
}
}
package com.jimind.sportdemo.utils;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Gson解析工具类
*
* @author Any
*/
public class GsonUtils {
/**
* 转成JSon格式的字符串
* @param object
* @return
*/
public static String createGsonString(Object object) {
Gson gson = new Gson();
return gson.toJson(object);
}
/**
* 转成Bean对象
* @param string
* @param cls
* @param <T>
* @return
*/
public static <T> T changeGsonToBean(String string, Class<T> cls) {
Gson gson = new Gson();
return gson.fromJson(string, cls);
}
/**
* 转成list
* 解决泛型问题
* @param json
* @param cls
* @param <T>
* @return
*/
public static <T> List<T> jsonToList(String json, Class<T> cls) {
Gson gson = new Gson();
List<T> list = new ArrayList<>();
JsonArray array = new JsonParser().parse(json).getAsJsonArray();
for(final JsonElement elem : array){
list.add(gson.fromJson(elem, cls));
}
return list;
}
/**
* 转成List集合
* @param string
* @param cls
* @param <T>
* @return
*/
public static <T> List<T> changeGsonToList(String string, Class<T> cls) {
Gson gson = new Gson();
return gson.fromJson(string, new TypeToken<List<T>>() {
}.getType());
}
/**
* 转成含有map的List集合
* @param string
* @param <T>
* @return
*/
public static <T> List<Map<String, T>> changeGsonToListMaps(
String string) {
List<Map<String, T>> list;
Gson gson = new Gson();
list = gson.fromJson(string, new TypeToken<List<Map<String, T>>>() {
}.getType());
return list;
}
/**
* 转成map
* @param string
* @param <T>
* @return
*/
public static <T> Map<String, T> changeGsonToMaps(String string) {
Map<String, T> map;
Gson gson = new Gson();
map = gson.fromJson(string, new TypeToken<Map<String, T>>() {
}.getType());
return map;
}
}
package com.jimind.sportdemo.utils;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
/**
* 图片加载
* @author Any
*/
@GlideModule
public class MyGlideApp extends AppGlideModule {
}
package com.jimind.sportdemo.utils;
import java.util.Locale;
/**
* 时间格式化工具类
* @author Any
*/
public class TimeFormatUtils {
public static String formatSeconds(long seconds) {
seconds=seconds/1000;
String standardTime;
if (seconds <= 0) {
standardTime = "00:00";
} else if (seconds < 60) {
standardTime = String.format(Locale.getDefault(), "00:%02d", seconds % 60);
} else if (seconds < 3600) {
standardTime = String.format(Locale.getDefault(), "%02d:%02d", seconds / 60, seconds % 60);
} else {
standardTime = String.format(Locale.getDefault(), "%02d:%02d:%02d", seconds / 3600, seconds % 3600 / 60, seconds % 60);
}
return standardTime;
}
}
package com.jimind.sportdemo.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import com.jimind.sportdemo.R;
/**
* 自定义view 圆形进度条--签到
*
* @author Any
*/
public class SignProgressBar extends View {
/**
* 圆的半径,圆环的宽度,圆环半径
*/
private float mRadius, mStrokeWidth, mRingRadius;
/**
* 圆的颜色,圆环的颜色,圆环的背景色
*/
private int mCircleColor, mRingColor, mRingBgColor;
/**
* 圆的画笔,圆环的画笔,圆环背景的画笔,文字画笔
*/
private Paint mCirclePaint, mRingPaint, mRingBgPaint, mTextPaint;
private float mTextHeight;
private int mProgress = 0, mTotalProgress = 100;
public SignProgressBar(Context context) {
this(context, null);
}
public SignProgressBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SignProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initAttribute(context, attrs);
initPaint();
}
/**
* 初始化自定义属性
*/
private void initAttribute(Context context, AttributeSet attrs) {
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SignProgressStyle, 0, 0);
int indexCount = typedArray.getIndexCount();
for (int i = 0; i < indexCount; i++) {
int attr = typedArray.getIndex(i);
switch (attr) {
case R.styleable.SignProgressStyle_radius:
mRadius = typedArray.getDimension(attr, 80);
break;
case R.styleable.SignProgressStyle_strokeWidth:
mStrokeWidth = typedArray.getDimension(attr, 10);
break;
case R.styleable.SignProgressStyle_circleColor:
mCircleColor = typedArray.getColor(attr, 0);
break;
case R.styleable.SignProgressStyle_ringColor:
mRingColor = typedArray.getColor(attr, 0);
break;
case R.styleable.SignProgressStyle_ringBgColor:
mRingBgColor = typedArray.getColor(attr, 0);
break;
default:
}
}
typedArray.recycle();
mRingRadius = mRadius + mStrokeWidth / 2;
}
/**
* 初始化画笔
*/
private void initPaint() {
//内圆
mCirclePaint = new Paint();
mCirclePaint.setAntiAlias(true);
mCirclePaint.setColor(mCircleColor);
mCirclePaint.setStyle(Paint.Style.FILL);
//外圆环背景
mRingBgPaint = new Paint();
mRingBgPaint.setAntiAlias(true);
mRingBgPaint.setColor(mRingBgColor);
mRingBgPaint.setStyle(Paint.Style.STROKE);
mRingBgPaint.setStrokeWidth(mStrokeWidth);
//外圆环
mRingPaint = new Paint();
mRingPaint.setAntiAlias(true);
mRingPaint.setColor(mRingColor);
mRingPaint.setStyle(Paint.Style.STROKE);
mRingPaint.setStrokeWidth(mStrokeWidth);
//设置线冒样式,有圆 有方
mRingPaint.setStrokeCap(Paint.Cap.ROUND);
//字体
mTextPaint = new Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setColor(mRingColor);
mTextPaint.setStyle(Paint.Style.FILL);
mTextPaint.setTextSize(mRadius / 2);
Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();
mTextHeight = (float) Math.ceil(fontMetrics.descent - fontMetrics.ascent);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int xCenter = getWidth() / 2;
int yCenter = getHeight() / 2;
//内圆
canvas.drawCircle(xCenter, yCenter, mRadius, mCirclePaint);
//外圆环背景
RectF bgOval = new RectF();
bgOval.left = xCenter - mRingRadius;
bgOval.top = yCenter - mRingRadius;
bgOval.right = xCenter + mRingRadius;
bgOval.bottom = yCenter + mRingRadius;
canvas.drawArc(bgOval, 0, 360, false, mRingBgPaint);
//外圆环
canvas.drawArc(bgOval, -90, 360 * mProgress / mTotalProgress, false, mRingPaint);
//文字
String content = String.valueOf(mProgress);
float textWidth = mTextPaint.measureText(content, 0, content.length());
canvas.drawText(content, xCenter - textWidth / 2, yCenter + mTextHeight / 4, mTextPaint);
}
/**
* 更新进度
*
* @param progress
*/
public void setProgress(int progress) {
mProgress = progress;
invalidate();
}
public void setTotalProgress(int progress) {
mTotalProgress = progress;
}
}
package com.jimind.sportdemo.view;
import android.content.Context;
import android.graphics.Canvas;
import android.support.v7.widget.AppCompatSeekBar;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* 垂直方向的seekBar
*
* @author Any
*/
public class VerticalSeekBar extends AppCompatSeekBar {
public VerticalSeekBar(Context context) {
super(context);
}
public VerticalSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VerticalSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(h, w, oldh, oldw);
}
@Override
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
}
@Override
protected void onDraw(Canvas c) {
//将SeekBar转转90度
c.rotate(-90);
//将旋转后的视图移动回来
c.translate(-getHeight(), 0);
super.onDraw(c);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled()) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
int i = 0;
//获取滑动的距离
i = getMax() - (int) (getMax() * event.getY() / getHeight());
//设置进度
setProgress(i);
//每次拖动SeekBar都会调用
onSizeChanged(getWidth(), getHeight(), 0, 0);
break;
case MotionEvent.ACTION_CANCEL:
break;
default:
}
return true;
}
}
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="#4A4A4A"/>
<item android:state_checked="true" android:color="#4A4A4A"/>
<item android:color="#FFFFFF"/> <!-- not selected -->
</selector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeWidth="1"
android:strokeColor="#00000000">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:bottomLeftRadius="8dp"
android:bottomRightRadius="8dp" />
<solid android:color="#4c000000" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="30dp"/>
<solid android:color="#4cffffff" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="#4c000000"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:topLeftRadius="8dp"
android:topRightRadius="8dp" />
<solid android:color="#4c000000" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="#33FFFFFF"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:bottomLeftRadius="8dp"
android:bottomRightRadius="8dp" />
<solid android:color="#19000000" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="4dp" />
<solid android:color="#19FFFFFF"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:topLeftRadius="4dp"
android:topRightRadius="4dp" />
<solid android:color="#19FFFFFF" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:topLeftRadius="8dp"
android:topRightRadius="8dp" />
<solid android:color="#19000000" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke android:color="@color/highLightColor" android:width="2dp"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="15dp"/>
<solid android:color="@color/highLightColor" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="30dp"/>
<solid android:color="@color/highLightColor" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="@color/highLightColor"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:topLeftRadius="10dp"
android:topRightRadius="10dp" />
<solid android:color="@color/highLightColor" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="#33FFFFFF" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="8dp" />
<stroke android:width="1dp" android:color="@color/highLightColor" />
<solid android:color="@android:color/transparent" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="18dp"
android:height="18dp" />
<solid android:color="#4DFBD4" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:bottomLeftRadius="10dp"
android:bottomRightRadius="10dp" />
<solid android:color="#fff" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#008577"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- background -->
<item
android:id="@android:id/background">
<shape>
<solid android:color="#FFF"/>
</shape>
</item>
<!--第2进度颜色-->
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<solid android:color="@color/highLightColor" />
</shape>
</clip>
</item>
<!--第1进度颜色-->
<item
android:id="@android:id/progress">
<clip>
<shape>
<solid android:color="@color/highLightColor"/>
</shape>
</clip>
</item>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@android:id/progress"
android:drawable="@drawable/little_star_on"/>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@android:id/progress"
android:drawable="@drawable/big_star_on"/>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- background -->
<item android:id="@android:id/background">
<shape>
<corners android:radius="6dp"/>
<solid android:color="#ffffff" />
</shape>
</item>
<!--第1进度颜色-->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="6dp"/>
<solid android:color="@color/highLightColor" />
</shape>
</clip>
</item>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="10dp" />
<solid android:color="#33FFFFFF" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#72000000"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/radio_on" android:state_checked="true" />
<item android:drawable="@drawable/radio_on" android:state_selected="true" />
<item android:drawable="@drawable/radio_off" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bg_light_rectangle30" android:state_checked="true" />
<item android:drawable="@drawable/bg_light_rectangle30" android:state_selected="true" />
<item android:drawable="@android:color/transparent" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_page2">
<include
android:id="@+id/include_title"
layout="@layout/include_title_bar" />
<android.support.constraint.Guideline
android:id="@+id/guide_left_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="30dp"
app:layout_constraintTop_toBottomOf="@id/include_title" />
<TextView
android:id="@+id/tv_course_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="篮球训练课程"
android:textColor="#FFF"
android:textSize="28sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="@id/guide_left_desc"
app:layout_constraintTop_toBottomOf="@id/include_title" />
<ProgressBar
android:id="@+id/pb_star"
style="@style/ProgressBarStar"
android:layout_width="133dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:max="133"
android:progress="103"
app:layout_constraintStart_toStartOf="@id/guide_left_desc"
app:layout_constraintTop_toBottomOf="@id/tv_course_name" />
<TextView
android:id="@+id/tv_grade_class"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_marginTop="15dp"
android:textColor="#4A4A4A"
android:text="5年级3班"
android:textSize="18sp"
android:gravity="center"
android:background="@drawable/bg_light_rectangle15"
app:layout_constraintStart_toStartOf="@id/guide_left_desc"
app:layout_constraintTop_toBottomOf="@id/pb_star" />
<TextView
android:id="@+id/tv_introduce_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="课程介绍:"
android:textColor="#FFF"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="@id/guide_left_desc"
app:layout_constraintTop_toBottomOf="@id/tv_grade_class" />
<TextView
android:id="@+id/tv_introduce"
android:layout_width="440dp"
android:layout_height="wrap_content"
android:text="投篮是篮球运动的主要进攻技术,任何技术、战术再娴熟,最后的目的和得分唯一的手段,就是将篮球投入篮圈。但是随着篮球运动的攻守对抗日续激烈,运动员的身体素质和身高基本都在提高,投篮出手也由低到高,投篮的速度也由慢到快。投篮的方式变化更多,但是无论使它怎样变化,它都是从最基本的投篮技术上演变来的。所以说投篮基本功是至关重要的。反过来有很多人会说,他们也知道投篮基本功必须打扎实,但是就是不知道该怎样去训练,那么今天我给大家一点一点的分析动作要领,到最后再把整个投篮动作连贯起来。"
android:textColor="#FFF"
android:textSize="14sp"
android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="@id/guide_left_desc"
app:layout_constraintTop_toBottomOf="@id/tv_introduce_label" />
<TextView
android:id="@+id/tv_number_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="学员人数:"
android:textColor="#FFF"
android:textSize="20sp"
app:layout_constraintStart_toStartOf="@id/guide_left_desc"
app:layout_constraintTop_toBottomOf="@id/tv_introduce" />
<Button
android:id="@+id/bt_subtract"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:background="@drawable/bg_light_rectangle8"
android:gravity="center"
android:text="-"
android:textColor="#4A4A4A"
android:textSize="40sp"
app:layout_constraintStart_toStartOf="@id/guide_left_desc"
app:layout_constraintTop_toBottomOf="@id/tv_number_label" />
<TextView
android:id="@+id/tv_number"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:background="@drawable/bg_alpha8_rectangle8"
android:gravity="center"
android:text="30"
android:textColor="#FFF"
android:textSize="40sp"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@id/bt_subtract"
app:layout_constraintTop_toBottomOf="@id/tv_number_label" />
<Button
android:id="@+id/bt_plus"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:background="@drawable/bg_light_rectangle8"
android:gravity="center"
android:text="+"
android:textColor="#4A4A4A"
android:textSize="40sp"
app:layout_constraintStart_toEndOf="@id/tv_number"
app:layout_constraintTop_toBottomOf="@id/tv_number_label" />
<android.support.constraint.Guideline
android:id="@+id/guide_right_course"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="30dp"
app:layout_constraintTop_toBottomOf="@id/include_title" />
<ImageView
android:id="@+id/iv_video"
android:layout_width="440dp"
android:layout_height="300dp"
android:layout_marginTop="30dp"
android:src="@drawable/start"
app:layout_constraintEnd_toEndOf="@id/guide_right_course"
app:layout_constraintTop_toBottomOf="@id/include_title" />
<Button
android:id="@+id/bt_start"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginTop="80dp"
android:layout_marginEnd="70dp"
android:background="@drawable/bg_light_rectangle8"
android:text="启动"
android:textColor="#4A4A4A"
android:textSize="28sp"
app:layout_constraintEnd_toEndOf="@id/guide_right_course"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@id/bt_plus"
app:layout_constraintTop_toBottomOf="@id/iv_video" />
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:pp="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_page2">
<!--标题菜单-->
<android.support.constraint.ConstraintLayout
android:id="@+id/cl_course_play"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#B22F3133">
<Button
android:id="@+id/bt_stop"
android:layout_width="120dp"
android:layout_height="30dp"
android:layout_marginStart="30dp"
android:background="@drawable/bg_light_rectangle8"
android:gravity="center"
android:src="@drawable/backup"
android:text="终止"
android:textColor="#4A4A4A"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_play_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="篮球训练课程"
android:textColor="#FFF"
android:textSize="32sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_record"
style="@style/TitleMenuButton"
android:layout_marginEnd="10dp"
android:background="@android:color/transparent"
android:drawableTop="@drawable/record"
android:text="语音启用"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/bt_control"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_control"
style="@style/TitleMenuButton"
android:layout_marginEnd="10dp"
android:background="@android:color/transparent"
android:drawableTop="@drawable/control"
android:text="屏幕控制"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
<android.support.constraint.Guideline
android:id="@+id/guide_left_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="30dp"
app:layout_constraintTop_toBottomOf="@id/cl_course_play" />
<TextView
android:id="@+id/tv_statistics_label"
android:layout_width="45dp"
android:layout_height="70dp"
android:layout_marginTop="15dp"
android:background="@drawable/bg_alpha9_rectangle4"
android:gravity="center"
android:text="实时
统计"
android:textColor="@color/highLightColor"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="@id/guide_left_play"
app:layout_constraintTop_toBottomOf="@id/cl_course_play" />
<!--人数-->
<LinearLayout
android:id="@+id/ll_total_number"
style="@style/CourseParam"
android:layout_marginStart="10dp"
app:layout_constraintStart_toEndOf="@id/tv_statistics_label"
app:layout_constraintTop_toBottomOf="@id/cl_course_play"
app:layout_constraintWidth_percent="0.135">
<ImageView
style="@style/CourseParamImage"
android:src="@drawable/number" />
<TextView
android:id="@+id/tv_total_number"
style="@style/CourseParamText"
android:drawableBottom="@drawable/number_label"
android:text="30" />
</LinearLayout>
<!--心跳-->
<LinearLayout
android:id="@+id/ll_heart_beat"
style="@style/CourseParam"
app:layout_constraintEnd_toStartOf="@id/ll_step_count"
app:layout_constraintStart_toEndOf="@id/ll_total_number"
app:layout_constraintTop_toBottomOf="@id/cl_course_play"
app:layout_constraintWidth_percent="0.135">
<ImageView
style="@style/CourseParamImage"
android:src="@drawable/heart_beat" />
<TextView
android:id="@+id/tv_heart_beat"
style="@style/CourseParamText"
android:drawableBottom="@drawable/heart_beat_label"
android:text="65" />
</LinearLayout>
<!--步数-->
<LinearLayout
android:id="@+id/ll_step_count"
style="@style/CourseParam"
app:layout_constraintEnd_toStartOf="@id/ll_strength"
app:layout_constraintStart_toEndOf="@id/ll_heart_beat"
app:layout_constraintTop_toBottomOf="@id/cl_course_play"
app:layout_constraintWidth_percent="0.145">
<ImageView
style="@style/CourseParamImage"
android:src="@drawable/step" />
<TextView
android:id="@+id/tv_step_count"
style="@style/CourseParamText"
android:layout_marginStart="10dp"
android:drawableBottom="@drawable/step_label"
android:text="2000" />
</LinearLayout>
<!--强度-->
<LinearLayout
android:id="@+id/ll_strength"
style="@style/CourseParam"
app:layout_constraintEnd_toStartOf="@id/ll_density"
app:layout_constraintStart_toEndOf="@id/ll_step_count"
app:layout_constraintTop_toBottomOf="@id/cl_course_play"
app:layout_constraintWidth_percent="0.135">
<ImageView
style="@style/CourseParamImage"
android:src="@drawable/strength" />
<TextView
android:id="@+id/tv_strength"
style="@style/CourseParamText"
android:drawableBottom="@drawable/strength_label"
android:text="30" />
</LinearLayout>
<!--密度-->
<LinearLayout
android:id="@+id/ll_density"
style="@style/CourseParam"
app:layout_constraintEnd_toStartOf="@id/ll_reach_rate"
app:layout_constraintStart_toEndOf="@id/ll_strength"
app:layout_constraintTop_toBottomOf="@id/cl_course_play"
app:layout_constraintWidth_percent="0.135">
<ImageView
style="@style/CourseParamImage"
android:src="@drawable/density" />
<TextView
android:id="@+id/tv_density"
style="@style/CourseParamText"
android:drawableBottom="@drawable/density_label"
android:text="30" />
</LinearLayout>
<!--达标率-->
<LinearLayout
android:id="@+id/ll_reach_rate"
style="@style/CourseParam"
app:layout_constraintEnd_toEndOf="@id/guide_right_play"
app:layout_constraintStart_toEndOf="@id/ll_density"
app:layout_constraintTop_toBottomOf="@id/cl_course_play"
app:layout_constraintWidth_percent="0.14">
<ImageView
style="@style/CourseParamImage"
android:src="@drawable/reach_rate" />
<TextView
android:id="@+id/tv_reach_rate"
style="@style/CourseParamText"
android:drawableBottom="@drawable/reach_rate_label"
android:text="60%" />
</LinearLayout>
<android.support.constraint.Guideline
android:id="@+id/guide_right_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="30dp"
app:layout_constraintTop_toBottomOf="@id/cl_course_play" />
<SurfaceView
android:id="@+id/video_player"
android:layout_width="620dp"
android:layout_height="315dp"
android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="@id/guide_left_play"
app:layout_constraintTop_toBottomOf="@id/ll_total_number" />
<ImageView
android:id="@+id/iv_player"
android:layout_width="620dp"
android:layout_height="315dp"
android:layout_marginTop="10dp"
android:scaleType="fitXY"
android:src="@drawable/video"
android:visibility="invisible"
app:layout_constraintStart_toStartOf="@id/guide_left_play"
app:layout_constraintTop_toBottomOf="@id/ll_total_number" />
<LinearLayout
android:id="@+id/ll_play_control"
android:layout_width="620dp"
android:layout_height="45dp"
android:layout_marginBottom="9dp"
android:background="#B2000000"
android:gravity="center_vertical"
android:paddingStart="10dp"
android:paddingEnd="8dp"
app:layout_constraintBottom_toTopOf="@id/ll_course_desc"
app:layout_constraintStart_toStartOf="@id/guide_left_play">
<ImageButton
android:id="@+id/ib_play"
android:layout_width="40dp"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:src="@drawable/play" />
<SeekBar
android:id="@+id/sk_play"
android:layout_width="385dp"
android:layout_height="wrap_content"
android:maxHeight="8dp"
android:progressDrawable="@drawable/progress_bar_horizontal"
android:splitTrack="false"
android:thumb="@drawable/bg_thumb" />
<TextView
android:id="@+id/tv_current_time"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="00:00"
android:textColor="#fff"
android:textSize="14sp" />
<TextView
android:id="@+id/tv_total_time"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="/ 00:00"
android:textColor="#fff"
android:textSize="14sp" />
<ImageButton
android:id="@+id/ib_light"
android:layout_width="46dp"
android:layout_height="match_parent"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:background="@android:color/transparent"
android:src="@drawable/light" />
<ImageButton
android:id="@+id/ib_voice"
android:layout_width="46dp"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:src="@drawable/voice" />
</LinearLayout>
<!--课程描述-->
<LinearLayout
android:id="@+id/ll_course_desc"
android:layout_width="620dp"
android:layout_height="95dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="10dp"
android:background="@drawable/bg_alpha7_rectangle8"
android:orientation="vertical"
android:padding="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@id/guide_left_play"
app:layout_constraintTop_toBottomOf="@id/video_player">
<TextView
android:id="@+id/tv_section_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第一节 队列列队"
android:textColor="#FFF"
android:textSize="14sp" />
<TextView
android:id="@+id/tv_section_summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:lineSpacingExtra="3dp"
android:scrollbars="vertical"
android:text="投篮是篮球运动的主要进攻技术,任何技术、战术再娴熟,最后的目的和得分唯一的手段,就是将篮球投入篮圈。但是随着篮球运动的攻守对抗日续激烈,运动员的身体素质和身高基本都在提高,投篮出手也由低到高,投篮的速度也由慢到快。投篮的方式变化更多,但是无论使它怎样变化,它都是从最基本的投篮技术上演变来的。所以说投篮基本功是至关重要的。反过来有很多人会说,他们也知道投篮基本功必须打扎实,但是就是不知道该怎样去训练,那么今天我给大家一点一点的分析动作要领,到最后再把整个投篮动作连贯起来。"
android:textColor="#FFF"
android:textSize="12sp" />
</LinearLayout>
<TextView
android:layout_width="270dp"
android:layout_height="40dp"
android:layout_marginTop="10dp"
android:background="@drawable/bg_alpha9_top4"
android:gravity="center_vertical"
android:paddingStart="10dp"
android:text="视频选集"
android:textColor="#fff"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="@id/guide_right_play"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@id/video_player"
app:layout_constraintTop_toBottomOf="@id/ll_total_number" />
<TextView
android:id="@+id/tv_section_count"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:gravity="center_vertical"
android:text="1/10"
android:textColor="#fff"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="@id/guide_right_play"
app:layout_constraintTop_toBottomOf="@id/ll_total_number" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rlv_section"
android:layout_width="270dp"
android:layout_height="378dp"
android:background="#19FFFFFF"
android:fadeScrollbars="false"
android:scrollbarSize="8dp"
android:scrollbarStyle="outsideInset"
android:scrollbarThumbVertical="@drawable/scroll_thumb"
android:scrollbarTrackVertical="@drawable/scroll_track"
android:scrollbars="vertical"
app:layout_constraintEnd_toEndOf="@id/guide_right_play"
app:layout_constraintTop_toBottomOf="@id/tv_section_count" />
<com.jimind.sportdemo.view.VerticalSeekBar
android:id="@+id/sk_voice"
android:layout_width="30dp"
android:layout_height="160dp"
android:layout_marginEnd="25dp"
android:background="#cc000000"
android:maxWidth="10dp"
android:maxHeight="8dp"
android:progressDrawable="@drawable/progress_bar_vertical"
android:splitTrack="false"
android:thumb="@drawable/bg_thumb"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@id/ll_play_control"
app:layout_constraintEnd_toStartOf="@id/rlv_section" />
<com.jimind.sportdemo.view.VerticalSeekBar
android:id="@+id/sk_light"
android:layout_width="30dp"
android:layout_height="160dp"
android:layout_marginEnd="20dp"
android:background="#cc000000"
android:maxHeight="8dp"
android:progressDrawable="@drawable/progress_bar_vertical"
android:splitTrack="false"
android:thumb="@drawable/bg_thumb"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@id/ll_play_control"
app:layout_constraintEnd_toStartOf="@id/sk_voice" />
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_page1"
tools:context=".MainActivity">
<!--标题栏-->
<android.support.constraint.ConstraintLayout
app:layout_constraintTop_toTopOf="parent"
android:id="@+id/cl_main"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#B22F3133"
android:focusable="true"
android:focusableInTouchMode="true">
<ImageView
android:id="@+id/iv_logo"
android:layout_width="130dp"
android:layout_height="match_parent"
android:layout_marginStart="15dp"
android:src="@drawable/logo"
app:layout_constraintBottom_toBottomOf="@id/cl_main"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/cl_main" />
<Button
android:id="@+id/bt_subject"
style="@style/SelectMoreButton"
android:layout_marginStart="20dp"
android:text="科目"
android:layout_width="120dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_logo"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_grade"
style="@style/SelectMoreButton"
android:text="年级"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/bt_subject"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_classes"
style="@style/SelectMoreButton"
android:text="班级"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/bt_grade"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_difficulty"
style="@style/SelectMoreButton"
android:text="难度"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/bt_classes"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/et_search"
style="@style/SelectMoreButton"
android:layout_width="150dp"
android:drawableEnd="@drawable/search"
android:hint="班级、年级、难度"
android:textColorHint="#E5FFFFFF"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/bt_difficulty"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_search"
android:layout_width="40dp"
android:layout_height="32dp"
android:layout_marginStart="120dp"
android:background="@android:color/transparent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/bt_difficulty"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_head_photo"
style="@style/TitleMenuButton"
android:layout_marginEnd="10dp"
android:drawableTop="@drawable/user_photo"
android:text="王刚"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_system_setting"
style="@style/TitleMenuButton"
android:layout_marginEnd="5dp"
android:drawableTop="@drawable/system_setting"
android:text="系统设置"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/bt_head_photo"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_data_statistics"
style="@style/TitleMenuButton"
android:layout_marginEnd="5dp"
android:drawableTop="@drawable/data_statistics"
android:text="数据统计"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/bt_system_setting"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
<ImageButton
android:id="@+id/ib_arrow_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:background="@android:color/transparent"
android:src="@drawable/arrow_left"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_main" />
<ImageButton
android:id="@+id/ib_arrow_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="15dp"
android:background="@android:color/transparent"
android:src="@drawable/arrow_right"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_main" />
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/sf_course"
android:layout_width="800dp"
android:layout_height="400dp"
android:layout_margin="10dp"
android:layout_marginStart="20dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="20dp"
app:layout_constraintBottom_toTopOf="@id/ll_copyright"
app:layout_constraintEnd_toStartOf="@id/ib_arrow_right"
app:layout_constraintStart_toEndOf="@id/ib_arrow_left"
app:layout_constraintTop_toBottomOf="@id/cl_main">
<android.support.v7.widget.RecyclerView
android:id="@+id/rlv_course"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
<!--版权信息-->
<LinearLayout
android:id="@+id/ll_copyright"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="15dp"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="系统版本:1.0"
android:textColor="#9A999A"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="40dp"
android:gravity="center"
android:text="内置课件:40"
android:textColor="#9A999A"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="40dp"
android:gravity="center"
android:text="有效期限:2019年04月03日"
android:textColor="#9A999A"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="40dp"
android:gravity="center"
android:text="授权机构:某某小学"
android:textColor="#9A999A"
android:textSize="14sp" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/fl_setting"
layout="@layout/include_title_bar" />
<TextView
android:id="@+id/tv_ip_label"
android:layout_width="100dp"
android:layout_height="60dp"
android:gravity="center"
android:text="IP:"
android:layout_marginTop="30dp"
app:layout_constraintTop_toBottomOf="@id/fl_setting" />
<EditText
android:id="@+id/et_ip"
android:layout_width="800dp"
android:layout_height="60dp"
android:hint="请输入IP地址"
android:layout_marginTop="30dp"
app:layout_constraintStart_toEndOf="@id/tv_ip_label"
app:layout_constraintTop_toBottomOf="@id/fl_setting" />
<Button
android:id="@+id/bt_sure"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="确定"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/et_ip" />
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:any="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_page1">
<include layout="@layout/include_title_bar" />
<TextView
android:id="@+id/tv_sign_course"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:text="篮球训练课程"
android:textColor="#fff"
android:textSize="28sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_sign_class"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_marginStart="30dp"
android:layout_marginTop="15dp"
android:background="@drawable/bg_light_rectangle15"
android:gravity="center"
android:text="5年级3班"
android:textColor="#4A4A4A"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_sign_course"
app:layout_goneMarginTop="10dp" />
<com.jimind.sportdemo.view.SignProgressBar
android:id="@+id/pb_sign"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
any:circleColor="#4c000000"
any:radius="155dp"
any:ringBgColor="#4c979797"
any:ringColor="@color/highLightColor"
any:strokeWidth="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_total_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="85dp"
android:text="应到:40人"
android:textColor="#9A999A"
android:textSize="24sp"
app:layout_constraintBottom_toTopOf="@id/bt_skip"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/bt_finish"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginEnd="140dp"
android:layout_marginBottom="30dp"
android:background="@drawable/bg_light_rectangle8"
android:text="完成"
android:textColor="#4A4A4A"
android:textSize="28sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<Button
android:id="@+id/bt_skip"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginStart="140dp"
android:layout_marginBottom="30dp"
android:background="@drawable/bg_skip"
android:text="跳过"
android:textColor="@color/highLightColor"
android:textSize="28sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/tv_count_label"
android:layout_width="250dp"
android:layout_height="40dp"
android:layout_marginEnd="30dp"
android:layout_marginBottom="30dp"
android:background="@drawable/bg_alpha7_top8"
android:gravity="center_vertical"
android:paddingStart="15dp"
android:text="计时"
android:textColor="#fff"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:layout_width="250dp"
android:layout_height="80dp"
android:layout_marginEnd="30dp"
android:background="@drawable/bg_alpha9_top8"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_count_label" />
<TextView
android:id="@+id/tv_minute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:layout_marginEnd="180dp"
android:text="0 分钟"
android:textColor="#FFF"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_count_label" />
<TextView
android:id="@+id/tv_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:layout_marginEnd="80dp"
android:text="0秒"
android:textColor="#FFF"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_count_label" />
<View
android:layout_width="1dp"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:background="#9A999A"
app:layout_constraintEnd_toStartOf="@id/tv_second"
app:layout_constraintStart_toEndOf="@id/tv_minute"
app:layout_constraintTop_toBottomOf="@id/tv_count_label" />
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_page1">
<android.support.constraint.ConstraintLayout
android:id="@+id/cl_statistics"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#B22F3133">
<ImageButton
android:id="@+id/ib_bar_back"
android:layout_width="50dp"
android:layout_height="match_parent"
android:layout_marginStart="5dp"
android:background="@android:color/transparent"
android:src="@drawable/backup" />
<TextView
android:id="@+id/tv_bar_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="篮球训练课程"
android:textColor="#FFF"
android:textSize="24sp" />
<RadioGroup
android:id="@+id/rg_date"
android:layout_width="140dp"
android:layout_height="30dp"
android:layout_marginEnd="25dp"
android:background="@drawable/bg_alpha7_rectangle30"
android:gravity="center"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<RadioButton
android:id="@+id/rb_last"
android:layout_width="70dp"
android:layout_height="match_parent"
android:background="@drawable/selector_date"
android:button="@null"
android:gravity="center"
android:text="上周"
android:textColor="@color/btn_black_white"
android:textSize="12sp" />
<RadioButton
android:id="@+id/rb_current"
android:layout_width="70dp"
android:layout_height="match_parent"
android:background="@drawable/selector_date"
android:button="@null"
android:checked="true"
android:gravity="center"
android:text="本周"
android:textColor="@color/btn_black_white"
android:textSize="12sp" />
</RadioGroup>
<TextView
android:id="@+id/tv_data_date"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginEnd="30dp"
android:gravity="center"
android:text="2018.12.03-2018.12.07"
android:textColor="#9A999A"
app:layout_constraintEnd_toStartOf="@id/rg_date" />
</android.support.constraint.ConstraintLayout>
<android.support.constraint.Guideline
android:id="@+id/gl_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="30dp"
app:layout_constraintStart_toStartOf="parent" />
<android.support.constraint.Guideline
android:id="@+id/gl_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintGuide_end="30dp" />
<TextView
android:id="@+id/tv_school_label"
style="@style/TextLabelStyle"
android:text="本周学校体育活动完成概况"
app:layout_constraintStart_toStartOf="@id/gl_left"
app:layout_constraintTop_toBottomOf="@id/cl_statistics" />
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/school_chart"
android:layout_width="445dp"
android:layout_height="260dp"
android:background="@drawable/bg_alpha9_bottom8"
app:layout_constraintStart_toStartOf="@id/gl_left"
app:layout_constraintTop_toBottomOf="@id/tv_school_label" />
<TextView
android:id="@+id/tv_grade_label"
style="@style/TextLabelStyle"
android:text="本周年级体育活动完成率"
app:layout_constraintStart_toStartOf="@id/gl_left"
app:layout_constraintTop_toBottomOf="@id/school_chart" />
<com.github.mikephil.charting.charts.HorizontalBarChart
android:id="@+id/grade_chart"
android:layout_width="445dp"
android:layout_height="160dp"
android:background="@drawable/bg_alpha9_bottom8"
app:layout_constraintStart_toStartOf="@id/gl_left"
app:layout_constraintTop_toBottomOf="@id/tv_grade_label" />
<TextView
android:id="@+id/tv_teacher_label"
style="@style/TextLabelStyle"
android:text="老师本周课时"
app:layout_constraintEnd_toEndOf="@id/gl_right"
app:layout_constraintTop_toBottomOf="@id/cl_statistics" />
<TextView
android:id="@+id/tv_bill_label"
android:layout_width="445dp"
android:layout_height="30dp"
android:layout_marginEnd="30dp"
android:background="#19000000"
android:gravity="center_vertical"
android:paddingStart="15dp"
android:text="排名"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_teacher_label" />
<TextView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginEnd="40dp"
android:gravity="center_vertical"
android:text="姓名"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toStartOf="@id/tv_course_hour"
app:layout_constraintTop_toBottomOf="@id/tv_teacher_label" />
<TextView
android:id="@+id/tv_course_hour"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginEnd="30dp"
android:gravity="center_vertical"
android:text="本周课时"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toStartOf="@id/tv_load_label"
app:layout_constraintTop_toBottomOf="@id/tv_teacher_label" />
<TextView
android:id="@+id/tv_load_label"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginEnd="30dp"
android:gravity="center_vertical"
android:text="运动负荷"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintEnd_toStartOf="@id/tv_density_label"
app:layout_constraintTop_toBottomOf="@id/tv_teacher_label" />
<TextView
android:id="@+id/tv_density_label"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginEnd="50dp"
android:gravity="center_vertical"
android:text="运动密度"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_teacher_label" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rlv_teacher"
android:layout_width="445dp"
android:layout_height="230dp"
android:background="@drawable/bg_alpha9_bottom8"
app:layout_constraintEnd_toEndOf="@id/gl_right"
app:layout_constraintTop_toBottomOf="@id/tv_course_hour" />
<TextView
android:id="@+id/tv_class_label"
style="@style/TextLabelStyle"
android:text="本周班级体育活动完成率"
app:layout_constraintEnd_toEndOf="@id/gl_right"
app:layout_constraintTop_toBottomOf="@id/rlv_teacher" />
<com.github.mikephil.charting.charts.HorizontalBarChart
android:id="@+id/class_chart"
android:layout_width="445dp"
android:layout_height="160dp"
android:background="@drawable/bg_alpha9_bottom8"
app:layout_constraintEnd_toEndOf="@id/gl_right"
app:layout_constraintTop_toBottomOf="@id/tv_class_label" />
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_page1">
<TextView
android:id="@+id/tv_title_label"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#B22F3133"
android:gravity="center"
android:text="课程总结"
android:textColor="#FFF"
android:textSize="24sp" />
<android.support.constraint.Guideline
android:id="@+id/gl_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="30dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_title_label" />
<TextView
android:id="@+id/tv_class_course"
style="@style/TextLabelStyle"
android:text="年级班级:5年级3班 课程:篮球训练课程"
app:layout_constraintStart_toStartOf="@id/gl_left"
app:layout_constraintTop_toBottomOf="@id/tv_title_label" />
<TextView
android:id="@+id/tv_summary_density"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginEnd="30dp"
android:text="46"
android:textColor="@color/highLightColor"
android:textSize="38sp"
android:textStyle="bold"
app:layout_constraintEnd_toStartOf="@id/tv_summary_strength"
app:layout_constraintStart_toStartOf="@id/gl_left"
app:layout_constraintTop_toBottomOf="@id/tv_class_course" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="30dp"
android:text="运动密度"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toStartOf="@id/tv_summary_strength"
app:layout_constraintStart_toStartOf="@id/gl_left"
app:layout_constraintTop_toBottomOf="@id/tv_summary_density" />
<View
android:layout_width="2dp"
android:layout_height="60dp"
android:layout_marginTop="30dp"
android:background="#7FFFFFFF"
app:layout_constraintEnd_toStartOf="@id/tv_summary_strength"
app:layout_constraintStart_toEndOf="@id/tv_summary_density"
app:layout_constraintTop_toBottomOf="@id/tv_class_course" />
<TextView
android:id="@+id/tv_summary_strength"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginEnd="30dp"
android:text="1.9"
android:textColor="@color/highLightColor"
android:textSize="38sp"
android:textStyle="bold"
app:layout_constraintEnd_toStartOf="@id/tv_summary_rate"
app:layout_constraintStart_toEndOf="@id/tv_summary_density"
app:layout_constraintTop_toBottomOf="@id/tv_class_course" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="运动强度"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toStartOf="@id/tv_summary_rate"
app:layout_constraintStart_toEndOf="@id/tv_summary_density"
app:layout_constraintTop_toBottomOf="@id/tv_summary_strength" />
<View
android:layout_width="2dp"
android:layout_height="60dp"
android:layout_marginTop="30dp"
android:background="#7FFFFFFF"
app:layout_constraintEnd_toStartOf="@id/tv_summary_rate"
app:layout_constraintStart_toEndOf="@id/tv_summary_strength"
app:layout_constraintTop_toBottomOf="@id/tv_class_course" />
<TextView
android:id="@+id/tv_summary_rate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginEnd="10dp"
android:text="80%"
android:textColor="@color/highLightColor"
android:textSize="38sp"
android:textStyle="bold"
app:layout_constraintEnd_toStartOf="@id/tv_student_bill"
app:layout_constraintStart_toEndOf="@id/tv_summary_strength"
app:layout_constraintTop_toBottomOf="@id/tv_class_course" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="完成率"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toStartOf="@id/tv_student_bill"
app:layout_constraintStart_toEndOf="@id/tv_summary_strength"
app:layout_constraintTop_toBottomOf="@id/tv_summary_rate" />
<View
android:id="@+id/view_summary"
android:layout_width="445dp"
android:layout_height="120dp"
android:background="#19000000"
app:layout_constraintStart_toStartOf="@id/gl_left"
app:layout_constraintTop_toBottomOf="@id/tv_class_course" />
<TextView
android:id="@+id/tv_remark"
style="@style/TextLabelStyle"
android:background="@drawable/bg_alpha7_bottom8"
android:paddingStart="15dp"
android:layout_marginTop="-10dp"
android:text="老师:张超 人数:38人 时间:40分钟"
app:layout_constraintStart_toStartOf="@id/gl_left"
app:layout_constraintTop_toBottomOf="@id/view_summary" />
<TextView
android:id="@+id/tv_hear_beat_label"
style="@style/TextLabelStyle"
android:text="心跳步数统计"
app:layout_constraintStart_toStartOf="@id/gl_left"
app:layout_constraintTop_toBottomOf="@id/tv_remark" />
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/chart_hear_beat"
android:layout_width="445dp"
android:layout_height="180dp"
android:background="@drawable/bg_alpha9_bottom8"
app:layout_constraintStart_toStartOf="@id/gl_left"
app:layout_constraintTop_toBottomOf="@id/tv_hear_beat_label" />
<TextView
android:id="@+id/tv_student_bill"
style="@style/TextLabelStyle"
android:layout_marginEnd="30dp"
android:text="学员排行榜"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_title_label" />
<TextView
android:id="@+id/tv_bill_label"
android:layout_width="445dp"
android:layout_height="30dp"
android:layout_marginEnd="30dp"
android:background="#19000000"
android:gravity="center_vertical"
android:paddingStart="15dp"
android:text="排名"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_student_bill" />
<TextView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginEnd="80dp"
android:gravity="center_vertical"
android:text="姓名"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toStartOf="@id/tv_load_label"
app:layout_constraintTop_toBottomOf="@id/tv_student_bill" />
<TextView
android:id="@+id/tv_load_label"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginEnd="60dp"
android:gravity="center_vertical"
android:text="运动负荷"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintEnd_toStartOf="@id/tv_density_label"
app:layout_constraintTop_toBottomOf="@id/tv_student_bill" />
<TextView
android:id="@+id/tv_density_label"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginEnd="60dp"
android:gravity="center_vertical"
android:text="运动密度"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_student_bill" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rlv_bill"
android:layout_width="445dp"
android:layout_height="350dp"
android:layout_marginEnd="30dp"
android:layout_marginBottom="10dp"
android:background="@drawable/bg_alpha9_bottom8"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_bill_label" />
<Button
android:id="@+id/bt_over"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginBottom="20dp"
android:background="@drawable/bg_light_rectangle8"
android:text="结束"
android:textColor="#4A4A4A"
android:textSize="28sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="450dp"
android:layout_height="350dp"
android:background="@android:color/transparent">
<TextView
android:id="@+id/tv_class_grade"
android:layout_width="450dp"
android:layout_height="40dp"
android:background="@drawable/bg_light_top10"
android:gravity="center"
android:text="年级"
android:textColor="#4D4D4D"
android:textSize="18sp" />
<View
android:layout_width="450dp"
android:layout_height="310dp"
android:background="@drawable/bg_white_bottom10"
app:layout_constraintTop_toBottomOf="@id/tv_class_grade" />
<RadioGroup
android:id="@+id/rg_class"
android:layout_width="400dp"
android:layout_height="240dp"
android:orientation="vertical"
android:paddingStart="20dp"
app:layout_constraintTop_toBottomOf="@id/tv_class_grade">
</RadioGroup>
<Button
android:id="@+id/bt_positive"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:layout_marginBottom="30dp"
android:background="@drawable/bg_light_rectangle8"
android:text="确定"
android:textColor="#4A4A4A"
android:textSize="22dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<Button
android:id="@+id/bt_negative"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:layout_marginBottom="30dp"
android:background="@drawable/bg_skip"
android:text="取消"
android:textColor="@color/highLightColor"
android:textSize="22dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintEnd_toStartOf="@id/bt_positive" />
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black">
<FrameLayout
android:id="@+id/surface_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
</FrameLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fl_title_bar"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#B22F3133">
<ImageButton
android:id="@+id/ib_bar_back"
android:layout_width="50dp"
android:layout_marginStart="5dp"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:src="@drawable/backup" />
<TextView
android:id="@+id/tv_bar_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="篮球训练课程"
android:textColor="#FFF"
android:textSize="24sp" />
</FrameLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cl_bill"
android:layout_width="445dp"
android:layout_height="38dp"
android:background="#4c000000">
<TextView
android:id="@+id/tv_student_bill"
android:layout_width="45dp"
android:layout_height="match_parent"
android:gravity="center"
android:text="1"
android:textColor="#fff"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/tv_student_name"
style="@style/ListTextStyle"
android:layout_marginStart="0dp"
android:drawableLeft="@drawable/user_photo"
android:drawablePadding="10dp"
android:text="王明"
app:layout_constraintEnd_toStartOf="@id/tv_student_load"
app:layout_constraintStart_toEndOf="@id/tv_student_bill" />
<TextView
android:id="@+id/tv_student_load"
style="@style/ListTextStyle"
android:text="1.5"
app:layout_constraintEnd_toStartOf="@id/tv_student_density"
app:layout_constraintStart_toEndOf="@id/tv_student_name" />
<TextView
android:id="@+id/tv_student_density"
style="@style/ListTextStyle"
android:text="60%"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_student_load" />
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cl_section"
android:layout_width="270dp"
android:layout_height="130dp"
android:layout_marginBottom="8dp"
android:paddingStart="2dp"
android:paddingTop="2dp"
android:paddingEnd="2dp"
android:paddingBottom="2dp">
<ImageView
android:id="@+id/iv_section"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/video" />
<View
android:layout_width="match_parent"
android:layout_height="30dp"
android:background="#99000000"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/tv_section_title"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginStart="16dp"
android:gravity="center_vertical"
android:text="第1节 队列列队"
android:textColor="#FFF"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/tv_section_duration"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginEnd="16dp"
android:gravity="center_vertical"
android:text="03:00"
android:textColor="#FFF"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_marginBottom="10dp"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_course"
android:layout_width="200dp"
android:scaleType="fitXY"
android:layout_height="200dp"
android:src="@drawable/volleyball" />
<View
android:layout_width="176dp"
android:layout_height="55dp"
android:background="@drawable/bg_alpha"
app:layout_constraintBottom_toBottomOf="parent" />
<TextView
android:id="@+id/tv_grade"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginBottom="30dp"
android:text="5年级"
android:textColor="@color/highLightColor"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/tv_course_china"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginBottom="30dp"
android:text="排球训练课程"
android:textColor="#FFF"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_grade" />
<ProgressBar
android:id="@+id/pb_little_star"
style="@style/ProgressBarLittleStar"
android:layout_width="56dp"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="10dp"
android:max="55"
android:progress="11"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_course_china" />
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_content"
android:text="退出"
android:gravity="center"
android:textColor="#4A4A4A"
android:layout_width="90dp"
android:layout_height="30dp">
</TextView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cl_teacher"
android:layout_width="445dp"
android:layout_height="38dp"
android:background="#4c000000">
<TextView
android:id="@+id/tv_teacher_bill"
android:layout_width="45dp"
android:layout_height="match_parent"
android:gravity="center"
android:text="1"
android:textColor="#fff"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/tv_teacher_name"
style="@style/ListTextStyle"
android:layout_marginStart="0dp"
android:drawableLeft="@drawable/user_photo"
android:drawablePadding="10dp"
android:text="王明"
app:layout_constraintEnd_toStartOf="@id/tv_teacher_hour"
app:layout_constraintStart_toEndOf="@id/tv_teacher_bill" />
<TextView
android:id="@+id/tv_teacher_hour"
style="@style/ListTextStyle"
android:text="4"
app:layout_constraintEnd_toStartOf="@id/tv_teacher_load"
app:layout_constraintStart_toEndOf="@id/tv_teacher_name" />
<TextView
android:id="@+id/tv_teacher_load"
style="@style/ListTextStyle"
android:text="1.5"
app:layout_constraintEnd_toStartOf="@id/tv_teacher_density"
app:layout_constraintStart_toEndOf="@id/tv_teacher_hour" />
<TextView
android:id="@+id/tv_teacher_density"
style="@style/ListTextStyle"
android:text="60%"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_teacher_load" />
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rlv_ppw"
android:scrollbars="vertical"
android:layout_width="90dp"
android:background="@drawable/pop_"
android:layout_height="120dp">
</android.support.v7.widget.RecyclerView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--被引用较多的属性,分开写较好,如果只被引用一次,可以不用-->
<attr name="radius" format="dimension"/>
<declare-styleable name="SignProgressStyle">
<attr name="radius"/>
<attr name="strokeWidth" format="dimension"/>
<attr name="circleColor" format="color"/>
<attr name="ringColor" format="color"/>
<attr name="ringBgColor" format="color"/>
</declare-styleable>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#008577</color>
<color name="colorPrimaryDark">#00574B</color>
<color name="colorAccent">#D81B60</color>
<color name="highLightColor">#50E3C2</color>
<color name="lengendColor">#8C8C8C</color>
<color name="textColor">#4A4A4A</color>
</resources>
<resources>
<string name="app_name">SportDemo</string>
</resources>
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!--标题栏 筛选-->
<style name="SelectMoreButton">
<item name="android:layout_width">100dp</item>
<item name="android:layout_height">32dp</item>
<item name="android:background">@drawable/bg_select_more</item>
<item name="android:textColor">#E5FFFFFF</item>
<item name="android:textSize">12sp</item>
<item name="android:gravity">center_vertical</item>
<item name="android:paddingStart">15dp</item>
<item name="android:paddingEnd">10dp</item>
<item name="android:layout_marginStart">10dp</item>
<item name="android:drawableEnd">@drawable/select_more</item>
</style>
<!-- 标题栏 菜单-->
<style name="TitleMenuButton">
<item name="android:layout_width">50dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:drawablePadding">6dp</item>
<item name="android:textSize">12sp</item>
<item name="android:textColor">#9A999A</item>
</style>
<!-- 课程详情 大星星 -->
<style name="ProgressBarStar">
<item name="android:indeterminateOnly">false</item>
<item name="android:progressDrawable">@drawable/progress_bar_star</item>
<item name="android:indeterminateDrawable">
@android:drawable/progress_indeterminate_horizontal
</item>
<item name="android:minHeight">10dip</item>
<item name="android:maxHeight">30dip</item>
</style>
<!-- 课程列表 小星星 -->
<style name="ProgressBarLittleStar">
<item name="android:indeterminateOnly">false</item>
<item name="android:progressDrawable">@drawable/progress_bar_little_star</item>
<item name="android:indeterminateDrawable">
@android:drawable/progress_indeterminate_horizontal
</item>
<item name="android:minHeight">8dip</item>
<item name="android:maxHeight">30dip</item>
</style>
<!--课程参数-->
<style name="CourseParam">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">70dp</item>
<item name="android:layout_marginTop">15dp</item>
<item name="android:background">@drawable/bg_alpha9_rectangle4</item>
</style>
<!--课程图片-->
<style name="CourseParamImage">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginStart">10dp</item>
<item name="android:layout_marginTop">15dp</item>
</style>
<!--课程文字-->
<style name="CourseParamText">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginStart">10dp</item>
<item name="android:layout_marginTop">5dp</item>
<item name="android:drawablePadding">5dp</item>
<item name="android:textColor">@color/highLightColor</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">28sp</item>
</style>
<!--文字标签样式-->
<style name="TextLabelStyle">
<item name="android:layout_width">445dp</item>
<item name="android:layout_height">35dp</item>
<item name="android:background">@drawable/bg_alpha7_top8</item>
<item name="android:gravity">center_vertical</item>
<item name="android:textColor">#FFF</item>
<item name="android:textSize">16sp</item>
<item name="android:paddingStart">15dp</item>
<item name="android:layout_marginTop">10dp</item>
</style>
<!--列表文字样式 -->
<style name="ListTextStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">match_parent</item>
<item name="android:gravity">center_vertical</item>
<item name="android:textColor">#FFF</item>
<item name="android:textSize">18sp</item>
<item name="android:layout_marginStart">30dp</item>
</style>
</resources>
package com.jimind.sportdemo;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}
\ No newline at end of file
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
// 私有仓库地址
maven { url "https://jitpack.io" }
maven { url "http://lib.gcssloop.com/repository/gcssloop-central/" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
include ':app'
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment