Android 分享界面制作从底部滑出动画效果

1.自定义类如下:

BaseDialog:

import android.app.Dialog;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.KeyEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;

public class BaseDialog extends Dialog {
    public View mCreateView;
    public Context mContext;
    public int mScreenWidth;//屏幕宽  
    public int mScreenHeight;//屏幕高  
    public int mDensity;//单位像素  
    public Animation mExitAnim;//退出动画  
    public Animation mEnterAnim;//进入动画  

    public BaseDialog(Context context) {
        super(context);
        init(context);
    }

    private void init(Context context) {
        mContext = context;
        //计算屏幕的宽高像素  
        DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
        mScreenHeight = metrics.heightPixels;
        mScreenWidth = metrics.widthPixels;
        mDensity = (int) metrics.density;
    }

    @Override
    public void show() {
        super.show();
        enterAnimation();//进入动画  
    }

    /**
     *  
     *      * 进入动画 
     *      
     */
    private void enterAnimation() {
        if (mEnterAnim == null) {
            mEnterAnim = new TranslateAnimation(1, 0, 1, 0, 1, 1, 1, 0);
            mEnterAnim.setDuration(500);
        }
        mCreateView.startAnimation(mEnterAnim);
    }

    /**
     *  
     *      * 退出动画 
     *      
     */
    private void exitAnimation() {
        if (mExitAnim == null) {
            mExitAnim = new TranslateAnimation(1, 0, 1, 0, 1, 0, 1, 1);
            mExitAnim.setDuration(500);
            mExitAnim.setAnimationListener(
                    new AnimationListener() {
                        @Override
                        public void onAnimationStart(Animation animation) {
                        }

                        @Override
                        public void onAnimationRepeat(Animation animation) {
                        }

                        @Override
                        public void onAnimationEnd(Animation animation) {
                            dismissDialog(); //动画完成执行关闭  
                        }
                    });
        }
        mCreateView.startAnimation(mExitAnim);
    }

    /**
     *  
     *      * 执行关闭 
     *      
     */


    private void dismissDialog() {
        super.dismiss();
    }

    /**
     *  
     *      * 执行动画 
     *      
     */

    @Override

    public void dismiss() {
        exitAnimation();
    }

    @Override

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_MENU) {
            dismiss();
        }
        return super.onKeyDown(keyCode, event);
    }

ShareDialog:

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.example.king.shenggaofei_galleryfinal.R;

/**
 * sgf
 * QQ分享底部弹出动画
 */
public class ShareDialog extends BaseDialog{
    //界面显示的数据
    private String[]  mTexts={"QQ好友","QQ空间","微信好友","微信朋友圈","微信收藏","新浪微博"};
    private int[]	  mImgs={R.drawable.ic_launcher_background,R.drawable.ic_launcher_background,
            R.drawable.ic_launcher_background,R.drawable.ic_launcher_background,R.drawable.ic_launcher_background,
            R.drawable.ic_launcher_background};//图片数据

    private OnClickListener mListener;

    public ShareDialog(Context context) {
        super(context);
        mCreateView=initView();
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置Dialog没有标题。需在setContentView之前设置,在之后设置会报错
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        //设置Dialog背景透明效果,必须设置一个背景,否则会有系统的Dialog样式:外部白框
        this.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
        setContentView(mCreateView);//添加视图布局
        setLayout();
    }

    private View initView() {
        int num=mTexts.length;
        int number=3;//一行显示的数量 //最外面的布局
        LinearLayout group=new LinearLayout(mContext);
        LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);

        group.setLayoutParams(params);
        group.setBackgroundColor(Color.BLACK);
        group.setOrientation(LinearLayout.VERTICAL);//设置垂直方向
        //标题
        TextView title=new TextView(mContext);
        params=new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                50*mDensity);
        params.bottomMargin=1;
        title.setLayoutParams(params);
        title.setText("分享");
        title.setTextColor(Color.BLACK);
        title.setTextSize(16);
        title.setGravity(Gravity.CENTER);//字居中
        title.setBackgroundColor(Color.WHITE);
        group.addView(title);
        //设置内容
        for(int i=0,j=0;i<num;){
            j++;
            LinearLayout ll=new LinearLayout(mContext);
            params=new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    0,1.0f);//设置权重
            ll.setLayoutParams(params);
            ll.setBackgroundColor(Color.WHITE);
            ll.setOrientation(LinearLayout.HORIZONTAL);//设置水平方向
            group.addView(ll);
            for(;i<j*number && i<num;i++){//一行三个
                //设置分享图文控件
                TextView item=new TextView(mContext);
                params=new LinearLayout.LayoutParams(
                        mScreenWidth/number,
                        LinearLayout.LayoutParams.MATCH_PARENT
                );
                params.topMargin=10*mDensity;
                params.bottomMargin=10*mDensity;
                item.setLayoutParams(params);
                item.setBounds(50, 50);//设置图片的宽高
                Drawable top = mContext.getResources().getDrawable(mImgs[i]);
                item.setCompoundDrawablesWithIntrinsicBounds(null, top , null, null);//给DrawableTop设置图片
                item.setText(mTexts[i]);//设置文字
                item.setGravity(Gravity.CENTER);//字居中
                MyOnClickListener listener=new MyOnClickListener(i);
                item.setOnClickListener(listener);//设置点击监听器
                ll.addView(item);
            }
        }
        //底部
        TextView cancel=new TextView(mContext);
        params=new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                50*mDensity);
        params.topMargin=1;
        cancel.setLayoutParams(params);
        cancel.setText("取消");
        cancel.setTextColor(Color.BLACK);
        cancel.setTextSize(16);
        cancel.setGravity(Gravity.CENTER);//字居中
        cancel.setBackgroundColor(Color.WHITE);
        cancel.setOnClickListener(new View.OnClickListener() {//设置取消
            public void onClick(View arg0) {
                ShareDialog.this.cancel();
            }
        });
        group.addView(cancel);
        return group;
    }
    public class MyOnClickListener implements android.view.View.OnClickListener{
        private int mPosition;
        public MyOnClickListener(int position){
            mPosition=position;
        }
        @Override
        public void onClick(View v) {
//            Toast.makeText(mContext, mTexts[mPosition], Toast.LENGTH_SHORT).show();
            ShareDialog.this.cancel();
            if(mListener!=null){
                mListener.OnClick(v,mPosition);//调用自定义接口, TODO(分享在调用界面实现分享功能)
            }
        }
    }
    public interface OnClickListener {
        void OnClick(View v,int position);
    }
    public void setOnClickListener(OnClickListener listener){
        mListener=listener;
    }
    private void setLayout(){
        WindowManager.LayoutParams params=this.getWindow().getAttributes();
        params.width=mScreenWidth;
        params.gravity=Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;;//水平居中、底部
        this.getWindow().setAttributes(params);
    }

}

自定义TextView:

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;

public class TextView extends android.widget.TextView{
    private Context mContext;
    private int mWidth=30;
    private int mHeight=30;

    //保存设置的图片
    private Drawable mLeft,   mTop,   mRight,   mBottom;

    public TextView(Context context) {
        this(context,null);
    }

    public TextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext=context;
        init();
    }

    private void init() {
        float density=mContext.getResources().getDisplayMetrics().density;
        //将dip转化成px
        mWidth*=density;
        mHeight*=density;
        //手动调用该方法,设置文字上下左右方向的图片宽高
        setCompoundDrawablesWithIntrinsicBounds(mLeft, mTop, mRight, mBottom);//设置图片的宽高
    }
    /**
     * 重写该方法,文字上下左右方向的图片大小设置
     * @param left
     * @param top
     * @param right
     * @param bottom
     */
    @Override
    public void setCompoundDrawablesWithIntrinsicBounds( Drawable left,  Drawable top,  Drawable right,  Drawable bottom) {
        if (left != null) {
            left.setBounds(0, 0, mWidth, mHeight);
            mLeft=left;
        }
        if (right != null) {
            right.setBounds(0, 0, mWidth, mHeight);
            mRight=right;
        }
        if (top != null) {
            top.setBounds(0, 0, mWidth, mHeight);
            mTop=top;
        }
        if (bottom != null) {
            bottom.setBounds(0, 0, mWidth, mHeight);
            mBottom=bottom;
        }
        setCompoundDrawables(left, top, right, bottom);//设置图片的宽高
    }
    /**
     * 设置图片的宽高
     * @param width
     * @param height
     */
    public void setBounds(int width,int height){
        mWidth=width;
        mHeight=height;
        init();
    }

}

布局的形式是使用代码自定义实现的,没有布局,下面看看如何调用和监听:

  //分享
                ShareDialog shareDialog = new ShareDialog(MainActivity.this);
                shareDialog.show();
                shareDialog.setOnClickListener(new ShareDialog.OnClickListener() {
                    @Override
                    public void OnClick(View v, int position) {
                        if(position == 0){
                            Toast.makeText(MainActivity.this, position+"", Toast.LENGTH_SHORT).show();
                        }else  if(position == 1){
                            Toast.makeText(MainActivity.this, position+"", Toast.LENGTH_SHORT).show();
                        } else  if(position == 2){
                            Toast.makeText(MainActivity.this, position+"", Toast.LENGTH_SHORT).show();
                        }else  if(position == 3){
                            Toast.makeText(MainActivity.this, position+"", Toast.LENGTH_SHORT).show();
                        }else  if(position == 4){
                            Toast.makeText(MainActivity.this, position+"", Toast.LENGTH_SHORT).show();
                        }else  if(position == 5){
                            Toast.makeText(MainActivity.this, position+"", Toast.LENGTH_SHORT).show();
                        }else  if(position == 6){

                        }
                    }
                });

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值