根据需求的要求:当收听过的歌曲,就会有播放进度。当正在收听过的歌曲,不仅有播放进度,同时有高亮动画。从来没有听过的歌曲,显示歌曲名称就可以。
那么为了对应进度,progressbar的样式定制很关键。。。
先亮出XML 布局:
Activity的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#2c2255"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="1640px"
android:layout_height="100px"
android:background="#00ff00"
android:layout_marginRight="100px"
android:layout_alignParentRight="true"
/>
<GridView
android:layout_below="@id/tv"
android:layout_alignParentRight="true"
android:id="@+id/gridview"
android:layout_width="1640px"
android:layout_height="match_parent"
android:columnWidth="380px"
android:layout_marginRight="100px"
android:verticalSpacing="74px"
android:horizontalSpacing="40px"
android:numColumns="4"
android:stretchMode="columnWidth"
android:gravity="center" />
</RelativeLayout>
单条GridView的布局:
<?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="50dp"
>
<!--ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="99px"
android:src="@drawable/listitem_bg"
android:alpha="0.1"/>
<ImageView
android:id="@+id/image_progress"
android:visibility="gone"
android:layout_width="117px"
android:layout_height="99px"
android:src="@drawable/listitem_bg"
android:alpha="0.07"/-->
<ProgressBar
android:id="@+id/pb_progressbar"
style="@style/mProgressBarStyle"
android:layout_width="match_parent"
android:layout_height="100px"
android:max="100" />
<ProgressBar
android:id="@+id/pb_listening_progressbar"
android:visibility="gone"
style="@style/mProgressBar_listeningStyle"
android:layout_width="match_parent"
android:layout_height="100px"
android:max="100" />
<TextView
android:id="@+id/textView"
android:layout_marginLeft="31px"
android:layout_marginTop="20px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="28px"
android:textColor="#ffffff"
android:typeface="normal"/>
<TextView
android:id="@+id/textView_time"
android:layout_marginLeft="28px"
android:layout_marginTop="59px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="22px"
android:textColor="#ffffff"
android:alpha="0.4"
android:text="03:22"
android:typeface="normal"/>
<com.example.recycler.AudioColumnView
android:id="@+id/acv"
android:visibility="gone"
android:layout_marginLeft="26px"
android:layout_marginTop="30px"
android:layout_width="27px"
android:layout_gravity="center_horizontal"
android:background="@android:color/transparent"
android:layout_height="26px"/>
</RelativeLayout>
mProgressBar_listeningStyle布局:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- 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="mProgressBarStyle" parent="@android:style/Widget.ProgressBar.Horizontal">
<item name="android:maxHeight">100px</item>
<item name="android:minHeight">100px</item>
<item name="android:progressDrawable">@drawable/progress_horizontal</item>
<item name="android:indeterminateOnly">false</item>
<item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
</style>
<style name="mProgressBar_listeningStyle" parent="@android:style/Widget.ProgressBar.Horizontal">
<item name="android:maxHeight">100px</item>
<item name="android:minHeight">100px</item>
<item name="android:progressDrawable">@drawable/progress_horizontal_listening</item>
<item name="android:indeterminateOnly">false</item>
<item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
</style>
</resources>
progress_horizontal.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="4px" />
<solid android:color="#1Affffff"/>
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners
android:bottomLeftRadius="4px"
android:bottomRightRadius="0px"
android:topLeftRadius="4px"
android:topRightRadius="0px"
/>
<solid android:color="#0Dffffff"/>
</shape>
</clip>
</item>
</layer-list>
progress_horizontal_listening.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="4px" />
<gradient
android:startColor="#169c4ff3"
android:centerColor="#009c4ff3"
android:endColor="#319c4ff3"
android:angle="270"/>
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners
android:bottomLeftRadius="4px"
android:bottomRightRadius="0px"
android:topLeftRadius="4px"
android:topRightRadius="0px"
/>
<gradient
android:startColor="#4c05dd"
android:centerColor="#9b44ff"
android:endColor="#cb81ff"
android:angle="270"/>
</shape>
</clip>
</item>
</layer-list>
定义play_info类型的数据:
package com.example.recycler;
import androidx.annotation.NonNull;
import java.io.Serializable;
public class Playlist_Info implements Serializable {
private String play_list_item_name;
private String play_list_item_time;
private int play_list_item_progress;
private boolean is_Playing;
public Playlist_Info(){
}
public Playlist_Info(String play_list_item_name,String play_list_item_time,int play_list_item_progress)
{
this.play_list_item_name = play_list_item_name;
this.play_list_item_time = play_list_item_time;
this.play_list_item_progress = play_list_item_progress;
}
public String get_item_name() {return play_list_item_name;}
public void set_item_name(String play_list_item_name) {this.play_list_item_name = play_list_item_name;}
public String get_item_time() {return play_list_item_time;}
public void set_item_time(String play_list_item_time) {this.play_list_item_time = play_list_item_time;}
public int get_item_progress() {return play_list_item_progress;}
public void set_item_progress(int play_list_item_progress) {this.play_list_item_progress = play_list_item_progress;}
public boolean isPlaying() {return is_Playing;}
public void setIsPlaying(boolean is_playing){is_Playing = is_playing;}
@NonNull
@Override
public String toString() {
return "{" + "play_list_item_name='" + play_list_item_name + '\'' + ", play_list_item_time='" + play_list_item_time + '\'' + ", play_list_item_progress=" + play_list_item_progress + '}';
}
}
GridViewAdapter.java
package com.example.recycler;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroup.MarginLayoutParams;
import com.example.recycler.AudioColumnView;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Timer;
public class GridViewAdapter extends BaseAdapter {
private String log_tag = "GridViewAdapter";
private int listening_index;
private class GridHolder{
//ImageView imgback;
//ImageView imgprogress;
TextView textview;
TextView textview_time;
AudioColumnView audioColumnView;
ProgressBar pb_progressbar;
ProgressBar pb_listening_progressbar;
}
private Context context;
private List<Playlist_Info> listitem;
public GridViewAdapter(Context context,List<Playlist_Info> listitem){
this.context = context;
this.listitem = listitem;
}
@Override
public int getCount() {
return listitem.size();
}
@Override
public Object getItem(int position) {
return listitem.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
GridHolder holder;
if(view == null){
view = LayoutInflater.from(context).inflate(R.layout.playlist_item,null);
holder = new GridHolder();
holder.pb_progressbar = view.findViewById(R.id.pb_progressbar);
holder.pb_listening_progressbar=view.findViewById(R.id.pb_listening_progressbar);
holder.textview = (TextView)view.findViewById(R.id.textView);
holder.textview_time = (TextView)view.findViewById(R.id.textView_time);
holder.audioColumnView = (AudioColumnView)view.findViewById(R.id.acv);
view.setTag(holder);
}
else
{
holder = (GridHolder)view.getTag();
}
Playlist_Info info = listitem.get(position);
if(info != null)
{
int text_left_margin = 0;
if(position == 0)
{
text_left_margin = 19;
holder.pb_progressbar.setProgress(38);
holder.pb_listening_progressbar.setVisibility(View.GONE);
holder.audioColumnView.setVisibility(View.GONE);
holder.textview_time.setText("已听38%");
}
else if(position == 1)
{
text_left_margin = 67;
holder.pb_listening_progressbar.setProgress(listitem.get(position).get_item_progress());
holder.pb_progressbar.setVisibility(View.GONE);
holder.pb_listening_progressbar.setVisibility(View.VISIBLE);
holder.audioColumnView.setVisibility(View.VISIBLE);
holder.textview_time.setText("已听38%");
}
else
{
text_left_margin = 26;
holder.pb_progressbar.setProgress(0);
holder.pb_progressbar.setVisibility(View.VISIBLE);
holder.pb_listening_progressbar.setVisibility(View.GONE);
holder.audioColumnView.setVisibility(View.GONE);
holder.textview_time.setText( info.get_item_time());
}
Log.d(log_tag, String.valueOf(info.get_item_name().length()));
//改变字体位置
MarginLayoutParams marginLayoutParams_text = new MarginLayoutParams(holder.textview.getLayoutParams());
marginLayoutParams_text.setMargins(text_left_margin,19,0,0);
RelativeLayout.LayoutParams layoutParams_text = new RelativeLayout.LayoutParams(marginLayoutParams_text);
holder.textview.setLayoutParams(layoutParams_text);
holder.textview.setText( sub_string(info.get_item_name()));
}
return view;
}
String sub_string(String source_string)
{
String sub_string = "";
if(source_string.length()<8)
{
sub_string = source_string;
}
else
{
sub_string=source_string.substring(0, 4)+"..."+source_string.substring(source_string.length() - 4);
}
return sub_string;
}
}
MainActivity.java
package com.example.recycler;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ProgressBar;
import com.example.recycler.GridViewAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private GridView gridView;
private GridViewAdapter adapter;
private List<Playlist_Info> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (getSupportActionBar() != null){
getSupportActionBar().hide();
}
gridView = (GridView)this.findViewById(R.id.gridview);
list = new ArrayList<>();
for(int i = 1; i < 21;i++)
{
if(2 == i)
{
list.add(new Playlist_Info("大江东区浪淘尽,千古风流人物","3:22",30));
continue;
}
else
{
list.add(new Playlist_Info("精绝古城第"+String.valueOf(i)+"集","3:22",30));
}
}
adapter = new GridViewAdapter(MainActivity.this,list);
gridView.setAdapter(adapter);
progress_bar(1);
}
public void publishProgress(final int positionInAdapter, final int progress_time) {
list.get(positionInAdapter).set_item_progress(progress_time);
if (positionInAdapter >= gridView.getFirstVisiblePosition() &&
positionInAdapter <= gridView.getLastVisiblePosition()) {
int positionInListView = positionInAdapter - gridView.getFirstVisiblePosition();
ProgressBar item = (ProgressBar) gridView.getChildAt(positionInListView)
.findViewById(R.id.pb_listening_progressbar);
item.setProgress(progress_time);
}
}
private void progress_bar(final int positionInAdapter) {
list.get(positionInAdapter).setIsPlaying(true);
if (positionInAdapter >= gridView.getFirstVisiblePosition() &&
positionInAdapter <= gridView.getLastVisiblePosition()) {
int positionInListView = positionInAdapter - gridView.getFirstVisiblePosition();
ProgressBar item_listening = (ProgressBar) gridView.getChildAt(positionInListView)
.findViewById(R.id.pb_listening_progressbar);
item_listening.setVisibility(View.VISIBLE);
}
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i < 101; i++) {
final int progress = i;
runOnUiThread(new Runnable() {
@Override
public void run() {
publishProgress(positionInAdapter, progress);
}
});
SystemClock.sleep(5000);
}
}
}).start();
}
}
效果图:
