自定义view__封装Dialog-分享功能UI的实现

来源:互联网 发布:windows无法格式化cf 编辑:程序博客网 时间:2024/05/18 02:51

直接上图看效果
这里写图片描述

GitHub下载
实现的思路

  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()方法就可显示分享页面,同时监听点击动作

GitHub下载

欢迎留言交流

阅读全文
1 0
原创粉丝点击