改写控件之《自定义View,让你整个Layout像横向温度计一般》

转载请注明出处:王亟亟的大牛之路

恐惧自我受苦的人,已经正因自我的恐惧在受苦。

我们平时的进度条一般是下面这样子的

今天上的一个效果是这样的(初始化)

动起来后是这样的

给与用户一种新的体验吧,贴下项目结构

自定义控件:ProgressLayout

配套的监听事件:ProgressLayoutListener

适配器:RecylerListAdapter

对象类:Track(实际生产应该是 Json对象之类的)

OK,废话不多说,上代码

{ private int trackId; private String songName; private String singerName; private int durationInSec; private boolean isPlaying = false; public Track(int trackId, String songName, String singerName, int durationInSec) {this.trackId = trackId;this.songName = songName;this.singerName = singerName;this.durationInSec = durationInSec; } public String getSongName() {return songName; } (String songName) {this.songName = songName; } public String getSingerName() {return singerName; } (String singerName) {this.singerName = singerName; } () {return durationInSec; } (int durationInSec) {this.durationInSec = durationInSec; } () {return trackId; } (int trackId) {this.trackId = trackId; } () {return isPlaying; } (boolean isPlaying) {this.isPlaying = isPlaying; }}

分析:各字段的get,set方法,用于给对象赋值。

RecylerListAdapter

public .Adapter<RecylerListAdapter.ViewHolder> { /** * 数据源集合 */ private List<Track> trackList; /** * 当前播放的对象。 */ private Track currentTrack; /** * 持续时间 */ private int currentDuration = 0; /** * 是否正在播放 */ private boolean isPlaying = false; private static final int SECOND_MS = 1000; /** * recyclerview中调用的Handle */ private Handler mHandler = new Handler(); /** * 计算秒数 * */ private final Runnable mRunnable = new Runnable() {@Override public void run() {currentDuration += 1;mHandler.postDelayed(mRunnable, SECOND_MS);} }; /** * 传参 */ public void setTrackList(List<Track> trackList) {this.trackList = trackList;notifyDataSetChanged(); } /** * 创建holder */ @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {View view =LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item, viewGroup, false);ViewHolder viewHolder = new ViewHolder(view);return viewHolder; } /** * 绑定对象 */ @Override public void onBindViewHolder(final ViewHolder viewHolder, final int i) {final Track track = trackList.get(i);viewHolder.textViewDuration.setText(calculateSongDuration(track.getDurationInSec()));viewHolder.textViewSong.setText(track.getSongName());viewHolder.textViewSinger.setText(track.getSingerName());viewHolder.imageViewAction.setBackgroundResource(R.drawable.play);viewHolder.progressLayout.setMaxProgress(track.getDurationInSec());if (currentTrack != null && currentTrack == track) {viewHolder.imageViewAction.setBackgroundResource(isPlaying ? R.drawable.pause : R.drawable.play);viewHolder.progressLayout.setCurrentProgress(currentDuration);if (isPlaying) viewHolder.progressLayout.start();} else {viewHolder.progressLayout.cancel();}viewHolder.imageViewAction.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) {if (track != currentTrack) {currentTrack = track;mHandler.removeCallbacks(mRunnable);currentDuration = 0;}if (!viewHolder.progressLayout.isPlaying()) {isPlaying = true;viewHolder.progressLayout.start();mHandler.postDelayed(mRunnable, 0);viewHolder.imageViewAction.setBackgroundResource(R.drawable.pause);notifyDataSetChanged();} else {isPlaying = false;viewHolder.progressLayout.stop();mHandler.removeCallbacks(mRunnable);viewHolder.imageViewAction.setBackgroundResource(R.drawable.play);notifyDataSetChanged();}}});/** 播放按钮的监听事件* */viewHolder.progressLayout.setProgressLayoutListener(new ProgressLayoutListener() {@Override public void onProgressCompleted() {viewHolder.imageViewAction.setBackgroundResource(R.drawable.play);}@Override public void onProgressChanged(int seconds) {viewHolder.textViewDuration.setText(calculateSongDuration(seconds));}}); } /** * List大小 */ @Override public int getItemCount() {return trackList.size(); } /** * 换成分钟 */ private String calculateSongDuration(int seconds) {return new StringBuilder(String.valueOf(seconds / 60)).append(“:”).append(String.valueOf(seconds % 60)).toString(); } /** * ViewHolder对象 */ public static .ViewHolder {@Bind(R.id.imageviewAction) ImageView imageViewAction;@Bind(R.id.progressLayout) ProgressLayout progressLayout;@Bind(R.id.textviewSong) TextView textViewSong;@Bind(R.id.textviewSinger) TextView textViewSinger;@Bind(R.id.textviewDuration) TextView textViewDuration;public ViewHolder(View itemView) {super(itemView);ButterKnife.bind(this, itemView);} }}从起点,到尽头,也许快乐,或有时孤独,

改写控件之《自定义View,让你整个Layout像横向温度计一般》

相关文章:

你感兴趣的文章:

标签云: