android gridview中嵌套progressbar

根据需求的要求:当收听过的歌曲,就会有播放进度。当正在收听过的歌曲,不仅有播放进度,同时有高亮动画。从来没有听过的歌曲,显示歌曲名称就可以。

那么为了对应进度,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();
    }
}

效果图:

 

posted @ 2019-10-28 10:25  wxmwanggood  阅读(288)  评论(0编辑  收藏  举报