Android 自定义含有滚动选择器的对话框

转载请注明出处:http://blog.csdn.net/htwhtw123/article/details/79249949

1.概述

使用LIstView和Dialog实 自定义含有滚动选择器的对话框,可以设置显示字体的不同颜色,设置字体透明度,设置大小,设置显示多少项。下面给两个效果:

显示7项,字体透明度和大小改变 显示5项,字体颜色和大小改变
这里写图片描述 这里写图片描述

2.使用方法:

首先将本文最后的代码粘到对应的文件位置,然后在gradle配置中添加如下依赖:

compile 'com.android.support.constraint:constraint-layout:1.0.2'

创建WheelListDialog 对象。Context为上下文,data为将要显示的数据,为ArrayList类型。


        WheelListDialog dialog=new WheelListDialog(Context
         context,ArrayList<String>data);

给下面两个按钮设置监听事件

dialog.setListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.btOk:
                        Toast.makeText(MainActivity.this, dialog.getPositionData(), 
                        Toast.LENGTH_SHORT).show();
                        dialog.dismiss();
                        break;
                    case R.id.btCancel:
                        dialog.dismiss();
                        break;
                    default:
                        break;
                }
            }
        });

显示:

        dialog.show();

下面是默认效果(不去设置字体透明度,大小,颜色和显示数量)
这里写图片描述

下面会以显示7项(3+1+3)为例讲解,当然也可以是3项5项等。因为是7项所以设置:
颜色,字体,透明度数组长度都必须是4(3+1)
相对的如果是显示3项,颜色,字体,透明度数组长度都必须是2(1+1),中间一项之上就只有1项。
继续讲7项的情况:中间之上有3项(3+1+3嘛):

dialog.setShowNum(3);

可以设置颜色,依次为从中间向两边的颜色,为了方便,可以如下导入::

import static android.graphics.Color.*;
......
int[] textColor = {BLACK, YELLOW, RED, BLUE};
dialog.setTextColor(textColor);
...

设置字体大小,同样是从中间向两边

 int[] textSize = {15, 13, 12, 10};
dialog.setTextSize(textSize);

设置透明度

float textAlpha[] = {1.0f, 0.8f, 0.7f, 0.5f}
dialog.setTextAlpha(textAlpha);

以上设置完成后的效果:
这里写图片描述

再举个例子,这次不设置颜色,中间一项之上只有两项(2+1+2=5(项)):

List<String> data = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            data.add("第" + i + "项");
        }
final WheelListDialog dialog = new WheelListDialog(this, data);

        float textAlpha[] = {1.0f, 0.6f, 0.4f};
        int[] textSize = {15, 13, 11};
        dialog.setTextAlpha(textAlpha);
        dialog.setShowNum(2);
        dialog.setTextAlpha(textAlpha);
        dialog.setTextSize(textSize);
        dialog.setListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.btOk:
                        Toast.makeText(MainActivity.this, dialog.getPositionData(), Toast.LENGTH_SHORT).show();
                        dialog.dismiss();
                        break;
                    case R.id.btCancel:
                        dialog.dismiss();
                        break;
                    default:
                        break;
                }
            }
        });

        dialog.show();

效果:
这里写图片描述

3.代码资料,如上文所说使用

WheelListDialog.java:

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.constraint.ConstraintLayout;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.a10234736.test2.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by HeTingwei on 2018/2/3.
 * 以listView仿照wheelView(的样子)可以设置显示字体透明度,大小
 */

public class WheelListDialog extends AlertDialog {

    private static final String TAG = "WheelListDialog";

    private ListView mViewList;
    private int firstPosition;
    private View line1;
    private View line2;
    private ConstraintLayout constraintLayout;
    private View view;
    private Button btOk, btCancel;
    private Context mContext;
    private List<String> data = new ArrayList<>();
    private List<String> showData = new ArrayList<>();
    private WheelListAdapter adapter;
    private int showNum = 3;//中间子项上方显示子项数目
    private int textColor[] = {Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK};//默认黑色
    private int textSize[] = {15, 13, 12, 10};//字体大小,从中间向外侧排列,这里是默认值
    private int color = -1;
    private int size=-1;
    private float textAlpha[] = {1.0f, 0.8f, 0.7f, 0.5f};//字体透明度,从中间向外侧排列,这里是默认值
    private int itemHeight = dp2px(40);//每个子项高度为40dp
    private View.OnClickListener listener;

//初始化,设置显示数据
    public WheelListDialog(@NonNull Context context, List<String> data) {
        super(context,R.style.style_dialog);
        mContext = context;
        this.data = data;
        view = LayoutInflater.from(context).inflate(R.layout.wheel_list, null);
    }
//设置一个值,让显示字体颜色一致
    public void setTextColor(int textColor) {
        this.textColor = new int[showNum + 1];
        for (int i = 0; i <showNum+1 ; i++) {
            this.textColor[i] = textColor;
        }
    }
//设置一个值,让显示字体大小一致
    public void setTextSize(int textSize) {
        this.textSize = new int[showNum+1];
        for (int i = 0; i <showNum+1 ; i++) {
            this.textSize[i] = textSize;
        }
    }
//获取点击位置
    public String getPositionData(){
        return showData.get(firstPosition);
    }
//点击按钮监听
    public void setListener(View.OnClickListener listener){
        this.listener = listener;
    }

    //设置显示在中间之上的子项的数目
    public void setShowNum(int num) {
        showNum = num;
    }

    //设置显示字体大小,由中间向两侧排列
    public void setTextSize(int[] textSize) {
        this.textSize = textSize;
    }

    //设置显示字体透明度,由中间向两侧排列
    public void setTextAlpha(float[] textAlpha) {
        this.textAlpha = textAlpha;
    }

    //设置字体颜色,由中间向两侧排列
    public void setTextColor(int[] textColor) {
        this.textColor = textColor;
    }

    private void initView() {
        line1 = view.findViewById(R.id.line1);
        line2 = view.findViewById(R.id.line2);
        constraintLayout = (ConstraintLayout)view.findViewById(R.id.constraintLayout);
        mViewList = (ListView) view.findViewById(R.id.list_view);
        //设置大小
        ConstraintLayout.LayoutParams p = (ConstraintLayout.LayoutParams) constraintLayout.getLayoutParams();
        p.height = itemHeight * (showNum * 2 + 1)-2;
        ConstraintLayout.LayoutParams p1 = (ConstraintLayout.LayoutParams) line1.getLayoutParams();
        p1.topMargin = itemHeight * showNum;
        ConstraintLayout.LayoutParams p2 = (ConstraintLayout.LayoutParams) line2.getLayoutParams();
        p2.topMargin = itemHeight * (showNum + 1);

        btCancel = (Button)view.findViewById(R.id.btCancel);
        btOk = (Button)view.findViewById(R.id.btOk);


        adapter = new WheelListAdapter(mContext, showData);
        mViewList.setAdapter(adapter);
        mViewList.setOverScrollMode(android.view.View.OVER_SCROLL_NEVER);

        mViewList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                if (position - showNum >= 0 && position < showData.size() - showNum) {
                    if (position + 1 == firstPosition + showNum) {

                        mViewList.smoothScrollBy(-dp2px(40), 300);
                        mViewList.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                mViewList.requestFocusFromTouch();
                                mViewList.setSelection(position - showNum);
                            }
                        }, 300);
                    } else if (position < firstPosition + showNum) {
                        mViewList.smoothScrollByOffset(position - showNum - firstPosition + 1);
                        firstPosition = position - showNum + 1;
                    } else {
                        mViewList.smoothScrollByOffset(position - showNum - firstPosition);
                        firstPosition = position - showNum;
                    }
                    adapter.change(position);
                }
            }
        });

        mViewList.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                if (AbsListView.OnScrollListener.SCROLL_STATE_IDLE == scrollState) {
                    mViewList.smoothScrollToPosition(firstPosition);
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                Log.d(TAG, "onItemClick: " + firstVisibleItem);
                if (firstVisibleItem < firstPosition) {
                    firstPosition = firstVisibleItem;
                    adapter.change(firstVisibleItem + showNum);
                } else if (firstVisibleItem > firstPosition) {
                    firstPosition = firstVisibleItem;
                    adapter.change(firstVisibleItem + showNum);
                }
            }
        });

        btOk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mContext, "第" + firstPosition + "项", Toast.LENGTH_SHORT).show();
                WheelListDialog.this.dismiss();
            }
        });
        btCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                WheelListDialog.this.dismiss();
            }
        });
    }

    private int dp2px(float dipValue) {
        final float scale = getContext().getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }

    private boolean checkDataIsWrong() {
        if (textAlpha != null && textSize != null &&
                textSize.length == textAlpha.length &&
                textSize.length == showNum + 1 &&
                textColor.length == showNum + 1) return true;
        try {
            throw new Exception("The data is wrong!Please check the  variable:textSize,textAlpha,and showNum");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    @Override
    public void show() {
        super.show();
//        if (!checkDataIsWrong()) return;

        //让前面和后面都空出来
        for (int i = 0; i < showNum; i++) {
            showData.add("");
        }
        showData.addAll(data);
        for (int i = 0; i < showNum; i++) {
            showData.add("");
        }
        initView();
        setContentView(view);
        Window window = getWindow();
        WindowManager.LayoutParams p = window.getAttributes();
        p.height = WindowManager.LayoutParams.WRAP_CONTENT;
        p.width = WindowManager.LayoutParams.WRAP_CONTENT;
        p.dimAmount = 0.0f;
        window.setGravity(Gravity.CENTER);
        window.setAttributes(p);

    }


    //listView的适配器
    class WheelListAdapter extends BaseAdapter {

        List<String> data;
        Context mContext;
        List<TextBean> beanList = new ArrayList<>();

        public WheelListAdapter(Context mContext, List<String> data) {
            this.data = data;
            this.mContext = mContext;
            for (String str : data) {
                beanList.add(new TextBean(str));
            }
//初始化最先显示的数据
            for (int i = 0; i < showNum + 1; i++) {
                beanList.get(i).setAlphaAndSize(textAlpha[showNum - i], textSize[showNum - i]);
                beanList.get(i).setColor(textColor[showNum - i]);
            }
            for (int i = showNum + 1; i < showNum * 2 + 1; i++) {
                beanList.get(i).setAlphaAndSize(textAlpha[i - showNum], textSize[i - showNum]);
                beanList.get(i).setColor(textColor[i - showNum]);
            }
            beanList.get(showNum * 2 + 1).setAlphaAndSize(textAlpha[textAlpha.length - 1],
                    textSize[textSize.length - 1]);
            beanList.get(showNum * 2 + 1).setColor(textColor[textColor.length - 1]);
        }

        @Override
        public int getCount() {
            return data.size();
        }

        @Override
        public String getItem(int position) {
            return data.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
            if (convertView == null) {
                view = LayoutInflater.from(mContext).inflate(R.layout.wheel_list_item,
                        parent, false);
            } else {
                view = convertView;
            }
            TextView textView = (TextView)view.findViewById(R.id.text);
            TextBean text = beanList.get(position);
            textView.setText(text.getText());
            textView.setAlpha(text.getAlpha());
            textView.setTextSize(text.getSize());
            textView.setTextColor(text.getColor());
            return view;
        }

        private void change(int position) {
            for (int i = 0; i < showNum + 1; i++) {
                if (position + i < beanList.size()) {
                    beanList.get(position + i).setAlphaAndSize(textAlpha[i], textSize[i]);
                    beanList.get(position + i).setColor(textColor[i]);
                }
                if (position - i >= 0) {
                    beanList.get(position - i).setAlphaAndSize(textAlpha[i], textSize[i]);
                    beanList.get(position - i).setColor(textColor[i]);
                }
            }
            if (position + showNum + 1 < beanList.size()) {
                beanList.get(position + showNum + 1).setAlphaAndSize(textAlpha[showNum], textSize[showNum]);
                beanList.get(position + showNum + 1).setColor(textColor[showNum]);
            }
            if (position - showNum - 1 >= 0) {
                beanList.get(position - showNum - 1).setAlphaAndSize(textAlpha[showNum], textSize[showNum]);
                beanList.get(position - showNum - 1).setColor(textColor[showNum]);
            }
            notifyDataSetChanged();
        }
    }

    class TextBean {
        int size = 15;
        float alpha = 1.0f;
        String text;
        int color;

        public TextBean(String text) {
            this.text = text;
        }

        public void setAlphaAndSize(Float alpha, int size) {
            this.alpha = alpha;
            this.size = size;
        }

        public int getSize() {
            return size;
        }

        public float getAlpha() {
            return alpha;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        public int getColor() {
            return color;
        }

        public void setColor(int color) {
            this.color = color;
        }
    }
}

dialog布局文件:wheel_list.xml

<?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:background="@android:color/white"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/white">

    <android.support.constraint.ConstraintLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <android.support.constraint.ConstraintLayout
            android:id="@+id/constraintLayout"
            android:layout_width="200dp"
            android:layout_height="282dp"
            android:layout_marginTop="0dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <ListView
                android:id="@+id/list_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:divider="@null"
                android:listSelector="@android:color/transparent"
                android:scrollbars="none"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"></ListView>

            <View
                android:id="@+id/line1"
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:layout_marginTop="120dp"
                android:background="@android:color/black"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

            <View
                android:id="@+id/line2"
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:layout_marginTop="160dp"
                android:background="@android:color/black"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>
        </android.support.constraint.ConstraintLayout>

        <LinearLayout
            app:layout_constraintTop_toBottomOf="@id/constraintLayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="0dp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            >

            <Button
                android:id="@+id/btCancel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="0dp"
                android:background="#00000000"
                android:onClick="click1"
                android:text="取消"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/constraintLayout"/>

            <Button
                android:id="@+id/btOk"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="16dp"
                android:layout_marginTop="0dp"
                android:background="#00000000"
                android:onClick="click2"
                android:text="确定"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/constraintLayout"/>
        </LinearLayout>


    </android.support.constraint.ConstraintLayout>


</android.support.constraint.ConstraintLayout>

listView子项布局文件:wheel_list_item.xml

<?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="40dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/text"
        android:textStyle="bold"
        android:text="123"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

在values/strings.xml下,添加以下代码:

<style name="style_dialog" parent="android:style/Theme.Dialog">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

转载请注明出处:http://blog.csdn.net/htwhtw123/article/details/79249949

猜你喜欢

转载自blog.csdn.net/htwhtw123/article/details/79249949