要实现的效果如下:
布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.viewpager.widget.ViewPager
android:id="@+id/mViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_margin="30dp"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_music_switch"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/img_guide_music" />
<TextView
android:id="@+id/tv_guide_skip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="@string/text_guide_skip"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="50dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_guide_point_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/img_guide_point_p" />
<ImageView
android:id="@+id/iv_guide_point_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:src="@drawable/img_guide_point" />
<ImageView
android:id="@+id/iv_guide_point_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/img_guide_point" />
</LinearLayout>
</RelativeLayout>
ViewPager
/**
* FileName: BasePageAdapter
* Profile: PagerAdapter 基类
*/
public class BasePageAdapter extends PagerAdapter {
private List<View> mList;
public BasePageAdapter(List<View> mList) {
this.mList = mList;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
((ViewPager) container).addView(mList.get(position));
return mList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView(mList.get(position));
}
}
package com.hongx.yujian.ui;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import com.hongx.framework.base.BasePageAdapter;
import com.hongx.yujian.R;
import java.util.ArrayList;
import java.util.List;
/**
* @author: fuchenming
* @create: 2020/3/9 3:53 PM
*/
public class ViewPagerActivity extends AppCompatActivity {
private List<View> mPageList = new ArrayList<>();
private BasePageAdapter mPageAdapter;
private ViewPager mViewPager;
private ImageView iv_guide_star;
private ImageView iv_guide_night;
private ImageView iv_guide_smile;
private View view1;
private View view2;
private View view3;
private ImageView iv_guide_point_1;
private ImageView iv_guide_point_2;
private ImageView iv_guide_point_3;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_viewpager);
initView();
}
private void initView() {
mViewPager = findViewById(R.id.mViewPager);
view1 = View.inflate(this, R.layout.layout_pager_guide_1, null);
view2 = View.inflate(this, R.layout.layout_pager_guide_2, null);
view3 = View.inflate(this, R.layout.layout_pager_guide_3, null);
mPageList.add(view1);
mPageList.add(view2);
mPageList.add(view3);
//预加载
mViewPager.setOffscreenPageLimit(mPageList.size());
mPageAdapter = new BasePageAdapter(mPageList);
mViewPager.setAdapter(mPageAdapter);
iv_guide_point_1 = findViewById(R.id.iv_guide_point_1);
iv_guide_point_2 = findViewById(R.id.iv_guide_point_2);
iv_guide_point_3 = findViewById(R.id.iv_guide_point_3);
//帧动画
iv_guide_star = view1.findViewById(R.id.iv_guide_star);
iv_guide_night = view2.findViewById(R.id.iv_guide_night);
iv_guide_smile = view3.findViewById(R.id.iv_guide_smile);
//播放帧动画
AnimationDrawable animStar = (AnimationDrawable) iv_guide_star.getBackground();
animStar.start();
AnimationDrawable animNight = (AnimationDrawable) iv_guide_night.getBackground();
animNight.start();
AnimationDrawable animSmile = (AnimationDrawable) iv_guide_smile.getBackground();
animSmile.start();
//小圆点逻辑
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
seletePoint(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
/**
* 动态选择小圆点
*/
private void seletePoint(int position) {
switch (position) {
case 0:
iv_guide_point_1.setImageResource(R.drawable.img_guide_point_p);
iv_guide_point_2.setImageResource(R.drawable.img_guide_point);
iv_guide_point_3.setImageResource(R.drawable.img_guide_point);
break;
case 1:
iv_guide_point_1.setImageResource(R.drawable.img_guide_point);
iv_guide_point_2.setImageResource(R.drawable.img_guide_point_p);
iv_guide_point_3.setImageResource(R.drawable.img_guide_point);
break;
case 2:
iv_guide_point_1.setImageResource(R.drawable.img_guide_point);
iv_guide_point_2.setImageResource(R.drawable.img_guide_point);
iv_guide_point_3.setImageResource(R.drawable.img_guide_point_p);
break;
}
}
}
帧动画:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/img_guide_star_1" android:duration="2000"/>
<item android:drawable="@drawable/img_guide_star_2" android:duration="2000"/>
<item android:drawable="@drawable/img_guide_star_3" android:duration="2000"/>
<item android:drawable="@drawable/img_guide_star_3" android:duration="2000"/>
<item android:drawable="@drawable/img_guide_star_5" android:duration="2000"/>
<item android:drawable="@drawable/img_guide_star_4" android:duration="2000"/>
<item android:drawable="@drawable/img_guide_star_5" android:duration="2000"/>
</animation-list>
歌曲
/**
* FileName: MediaPlayerManager
* Profile: 媒体播放
*/
public class MediaPlayerManager {
//播放
public static final int MEDIA_STATUS_PLAY = 0;
//暂停
public static final int MEDIA_STATUS_PAUSE = 1;
//停止
public static final int MEDIA_STATUS_STOP = 2;
public int MEDIA_STATUS = MEDIA_STATUS_STOP;
private MediaPlayer mMediaPlayer;
private static final int H_PROGRESS = 1000;
private OnMusicProgressListener musicProgressListener;
/**
* 计算歌曲的进度:
* 1.开始播放的时候就开启循环计算时长
* 2.将进度计算结果对外抛出
*/
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
switch (message.what) {
case H_PROGRESS:
if (musicProgressListener != null) {
//拿到当前时长
int currentPosition = getCurrentPosition();
int pos = (int) (((float) currentPosition) / ((float) getDuration()) * 100);
musicProgressListener.OnProgress(currentPosition, pos);
mHandler.sendEmptyMessageDelayed(H_PROGRESS, 1000);
}
break;
}
return false;
}
});
public MediaPlayerManager() {
mMediaPlayer = new MediaPlayer();
}
/**
* 是否在播放
*/
public boolean isPlaying() {
return mMediaPlayer.isPlaying();
}
/**
* 开始播放
*/
public void startPlay(AssetFileDescriptor path) {
try {
mMediaPlayer.reset();
mMediaPlayer.setDataSource(path.getFileDescriptor(),
path.getStartOffset(), path.getLength());
mMediaPlayer.prepare();
mMediaPlayer.start();
MEDIA_STATUS = MEDIA_STATUS_PLAY;
mHandler.sendEmptyMessage(H_PROGRESS);
} catch (IOException e) {
LogUtils.e(e.toString());
e.printStackTrace();
}
}
/**
* 开始播放
*/
public void startPlay(String path) {
try {
mMediaPlayer.reset();
mMediaPlayer.setDataSource(path);
mMediaPlayer.prepare();
mMediaPlayer.start();
MEDIA_STATUS = MEDIA_STATUS_PLAY;
mHandler.sendEmptyMessage(H_PROGRESS);
} catch (IOException e) {
LogUtils.e(e.toString());
e.printStackTrace();
}
}
/**
* 暂停播放
*/
public void pausePlay() {
if (isPlaying()) {
mMediaPlayer.pause();
MEDIA_STATUS = MEDIA_STATUS_PAUSE;
removeHandler();
}
}
/**
* 继续播放
*/
public void continuePlay() {
mMediaPlayer.start();
MEDIA_STATUS = MEDIA_STATUS_PLAY;
mHandler.sendEmptyMessage(H_PROGRESS);
}
/**
* 停止播放
*/
public void stopPlay() {
mMediaPlayer.stop();
MEDIA_STATUS = MEDIA_STATUS_STOP;
removeHandler();
}
/**
* 获取当前位置
*/
public int getCurrentPosition() {
return mMediaPlayer.getCurrentPosition();
}
/**
* 获取总时长
*/
public int getDuration() {
return mMediaPlayer.getDuration();
}
/**
* 是否循环
*/
public void setLooping(boolean isLooping) {
mMediaPlayer.setLooping(isLooping);
}
/**
* 跳转位置
*/
public void seekTo(int ms) {
mMediaPlayer.seekTo(ms);
}
/**
* 无歌曲不需要监听进度
*/
public void removeHandler() {
if (mHandler != null) {
mHandler.removeMessages(H_PROGRESS);
}
}
/**
* 播放结束
*/
public void setOnComplteionListener(MediaPlayer.OnCompletionListener listener) {
mMediaPlayer.setOnCompletionListener(listener);
}
/**
* 播放错误
*/
public void setOnErrorListener(MediaPlayer.OnErrorListener listener) {
mMediaPlayer.setOnErrorListener(listener);
}
/**
* 播放进度
*/
public void setOnProgressListener(OnMusicProgressListener listener) {
musicProgressListener = listener;
}
public interface OnMusicProgressListener {
void OnProgress(int progress, int pos);
}
}
public class MediaPlayerActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView iv_music_switch;
private MediaPlayerManager mGuideMusic;
private ObjectAnimator mAnim;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_player);
initView();
startMusic();
}
private void initView() {
iv_music_switch = findViewById(R.id.iv_music_switch);
iv_music_switch.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.iv_music_switch:
if (mGuideMusic.MEDIA_STATUS == MediaPlayerManager.MEDIA_STATUS_PAUSE) {
mAnim.start();
mGuideMusic.continuePlay();
iv_music_switch.setImageResource(R.drawable.img_guide_music);
} else if (mGuideMusic.MEDIA_STATUS == MediaPlayerManager.MEDIA_STATUS_PLAY) {
mAnim.pause();
mGuideMusic.pausePlay();
iv_music_switch.setImageResource(R.drawable.img_guide_music_off);
}
break;
}
}
/**
* 播放音乐
*/
private void startMusic() {
mGuideMusic = new MediaPlayerManager();
mGuideMusic.setLooping(true);
final AssetFileDescriptor file = getResources().openRawResourceFd(R.raw.guide);
mGuideMusic.startPlay(file);
mGuideMusic.setOnComplteionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mGuideMusic.startPlay(file);
}
});
//旋转动画
mAnim = AnimUtils.rotation(iv_music_switch);
mAnim.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
mGuideMusic.stopPlay();
}
}
跳过按钮
case R.id.tv_guide_skip:
startActivity(new Intent(this, LoginActivity.class));
finish();
break;
点击跳过按钮进入登录页面。