1. 程式人生 > >自定義view__封裝Dialog-分享功能UI的實現

自定義view__封裝Dialog-分享功能UI的實現

直接上圖看效果
這裡寫圖片描述

  1. recyclerView–可以方便的新增多個分享,方便增加修改
  2. svg–svg可減少使得繪製更快,更流暢
  3. materialDialog–簡潔大方

因為分享功能可能需要增加或修改,所以使用recyclerView來顯示

看原始碼
item_share.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:layout_width="match_parent" android:layout_height="wrap_content">
<android.support.v7.widget.AppCompatImageView android:id="@+id/img_share" android:layout_width="wrap_content" android:layout_height
="wrap_content" android:minHeight="42dp" android:minWidth="42dp" app:srcCompat="@drawable/ic_moments" android:layout_marginLeft="8dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="8dp"
android:layout_marginRight="8dp" app:layout_constraintRight_toRightOf="parent" />
<TextView android:id="@+id/tvShare" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginTop="8dp" android:text="盆友圈" android:gravity="center_horizontal" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/img_share" app:layout_constraintVertical_bias="0.0" /> </android.support.constraint.ConstraintLayout>

tip:這裡使用的是ConstraintLayout佈局,試過你無法使用的的話可改回Linnerlayout或新增下面的程式碼到app的build.gradle中


dependencies {

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

}

item的顯示效果
這裡寫圖片描述

dialog_share.xml 只有一個recyclerView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"

    android:layout_height="wrap_content">
    <View style="@style/lineStyle"

        />
<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerViewShare"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</LinearLayout>

activity_main.xml 這個沒任何用處

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.jian.share.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginRight="8dp"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_marginLeft="8dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="8dp" />
</android.support.constraint.ConstraintLayout>

ShareInfo.java 儲存圖示和文字

/**
 * Created by jian on 2017/6/10.
 */

public class ShareInfo  {

    private int imgId;
    private String name;

    public ShareInfo(int imgId, String name) {
        this.imgId = imgId;
        this.name = name;
    }

    public int getImgId() {

        return imgId;
    }

    public void setImgId(int imgId) {
        this.imgId = imgId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

ShareAdapter.java 介面卡

/**
 * Created by jian on 2017/6/10.
 */

public class ShareAdapter extends RecyclerView.Adapter<ShareAdapter.MyViewHolder> {
    List<ShareInfo> shareInfos;

    public ShareAdapter(List<ShareInfo> shareInfos) {
        this.shareInfos = shareInfos;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_share, parent, false);
        return new MyViewHolder(v);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        ShareInfo shareInfo = shareInfos.get(position);
        holder.imageView.setImageResource(shareInfo.getImgId());
        holder.textView.setText(shareInfo.getName());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(onShareClickListener!=null){
                    onShareClickListener.onClick(position);
                }
            }
        });
    }

    public void setOnShareClickListener(OnShareClickListener onShareClickListener) {
        this.onShareClickListener = onShareClickListener;
    }

    @Override
    public int getItemCount() {
        return shareInfos.size();
    }

    private OnShareClickListener onShareClickListener;

    public interface OnShareClickListener {
        void onClick(int position);
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        private AppCompatImageView imageView;
        private TextView textView;

        public MyViewHolder(View itemView) {
            super(itemView);
            imageView = (AppCompatImageView) itemView.findViewById(R.id.img_share);
            textView = (TextView) itemView.findViewById(R.id.tvShare);
        }
    }
}

ShareDialog.java 這個是主要的程式碼

/**
 * Created by jian on 2017/6/10.
 */

public abstract   class ShareDialog {
    private Context mContext;
    public ShareDialog(Context mContext) {
        this.mContext = mContext;
        initShareInfo();
    }
    private void initShareInfo() {
        ShareInfo shareInfo = new ShareInfo(R.drawable.ic_wechat, "微信");
        shareInfos.add(shareInfo);
        shareInfo = new ShareInfo(R.drawable.ic_moments, "朋友圈");
        shareInfos.add(shareInfo);
        shareInfo = new ShareInfo(R.drawable.ic_qq, "QQ");
        shareInfos.add(shareInfo);
        shareInfo = new ShareInfo(R.drawable.ic_qqkongjian, "空間");
        shareInfos.add(shareInfo);

    }
    private List<ShareInfo> shareInfos = new ArrayList<>();
    private View dialogView;
    private RecyclerView recyclerView;
    AlertDialog.Builder builder;
    AlertDialog dialog;
    public void showDialog() {
        if (dialogView == null) {
            //只初始化一次
            dialogView = LayoutInflater.from(mContext).inflate(R.layout.dialog_share, null, false);
            recyclerView = (RecyclerView) dialogView.findViewById(R.id.recyclerViewShare);
            ShareAdapter shareAdapter = new ShareAdapter(shareInfos);
            shareAdapter.setOnShareClickListener(new ShareAdapter.OnShareClickListener() {
                @Override
                public void onClick(int position) {
                    onShareItemClick(position);
                    dialog.hide();
                }
            });
            recyclerView.setLayoutManager(new GridLayoutManager(mContext, 3));
            recyclerView.setAdapter(shareAdapter);
            builder = new AlertDialog.Builder(mContext);
            TextView title = new TextView(mContext);
            title.setText("分享方式");
            title.setPadding(10, 16, 10, 16);//設定title的邊距 left top ,right,bottom
            title.setGravity(Gravity.CENTER);//標題居中
// title.setTextColor(getResources().getColor(R.color.greenBG));
            title.setTextSize(23);
            builder.setCustomTitle(title);
            builder.setView(dialogView);
            dialog = builder.create();
            dialog.show();
        }
        else{
            dialog.show();
        }

    }
    abstract void onShareItemClick(int position);

}

MainActivity 只在這裡呼叫顯示

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ShareDialog shareDialog = new ShareDialog(this) {
            @Override
            void onShareItemClick(int position) {
                //點選的位置
                Log.i("onClick", position + "");
            }
        };
        shareDialog.showDialog();//顯示dialog
    }
}

好了。基本就這樣,dialog被封裝好後,只需要new一個然後呼叫showDialog()方法就可顯示分享頁面,同時監聽點選動作

歡迎留言交流