Android点赞效果

作者: Small_Cake | 来源:发表于2017-08-17 11:06 被阅读229次

    今天看到了一个点赞的效果,感觉还不错!于是抄袭了下来!
    其实它就是一个PopupWindow,点击后显示,然后做了上移和变淡的效果,最后消失!
    抄袭地址GoodView
    抄袭图片

    image.png

    其实主要的代码就一个继承类,和一个控制常量的接口

    package com.smallcake.utils.popup;
    
    import android.content.Context;
    import android.graphics.Color;
    import android.graphics.drawable.ColorDrawable;
    import android.graphics.drawable.Drawable;
    import android.os.Build;
    import android.os.Handler;
    import android.text.TextUtils;
    import android.util.TypedValue;
    import android.view.View;
    import android.view.animation.AlphaAnimation;
    import android.view.animation.Animation;
    import android.view.animation.AnimationSet;
    import android.view.animation.TranslateAnimation;
    import android.widget.PopupWindow;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    /**
     * 点赞
     */
    
    public class GoodView extends PopupWindow implements IGoodView {
    
        private String mText = TEXT;
    
        private int mTextColor = TEXT_COLOR;
    
        private int mTextSize = TEXT_SIZE;
    
        private int mFromY = FROM_Y_DELTA;
    
        private int mToY = TO_Y_DELTA;
    
        private float mFromAlpha = FROM_ALPHA;
    
        private float mToAlpha = TO_ALPHA;
    
        private int mDuration = DURATION;
    
        private int mDistance = DISTANCE;
    
        private AnimationSet mAnimationSet;
    
        private boolean mChanged = false;
    
        private Context mContext = null;
    
        private TextView mGood = null;
    
        public GoodView(Context context) {
            super(context);
            mContext = context;
            initView();
        }
    
        private void initView() {
            RelativeLayout layout = new RelativeLayout(mContext);
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            params.addRule(RelativeLayout.CENTER_HORIZONTAL);
            params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    
            mGood = new TextView(mContext);
            mGood.setIncludeFontPadding(false);
            mGood.setTextSize(TypedValue.COMPLEX_UNIT_DIP, mTextSize);
            mGood.setTextColor(mTextColor);
            mGood.setText(mText);
            mGood.setLayoutParams(params);
            layout.addView(mGood);
            setContentView(layout);
    
            int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
            int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
            mGood.measure(w, h);
            setWidth(mGood.getMeasuredWidth());
            setHeight(mDistance + mGood.getMeasuredHeight());
            setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            setFocusable(false);
            setTouchable(false);
            setOutsideTouchable(false);
    
            mAnimationSet = createAnimation();
        }
    
        /**
         * 设置文本
         *
         * @param text
         */
        public void setText(String text) {
            if (TextUtils.isEmpty(text)) {
                throw new IllegalArgumentException("text cannot be null.");
            }
            mText = text;
            mGood.setText(text);
            mGood.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            int w = (int) mGood.getPaint().measureText(text);
            setWidth(w);
            setHeight(mDistance + getTextViewHeight(mGood, w));
        }
    
        private static int getTextViewHeight(TextView textView, int width) {
            int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.AT_MOST);
            int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
            textView.measure(widthMeasureSpec, heightMeasureSpec);
            return textView.getMeasuredHeight();
        }
    
        /**
         * 设置文本颜色
         *
         * @param color
         */
        public void setTextColor(int color) {
            mTextColor = color;
            mGood.setTextColor(color);
        }
    
        /**
         * 设置文本大小
         *
         * @param textSize
         */
        public void setTextSize(int textSize) {
            mTextSize = textSize;
            mGood.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize);
        }
    
        /**
         * 设置文本信息
         *
         * @param text
         * @param textColor
         * @param textSize
         */
        public void setTextInfo(String text, int textColor, int textSize) {
            setTextColor(textColor);
            setTextSize(textSize);
            setText(text);
        }
    
        /**
         * 设置图片
         *
         * @param resId
         */
        public void setImage(int resId) {
            setImage(mContext.getResources().getDrawable(resId));
        }
    
        /**
         * 设置图片
         *
         * @param drawable
         */
        public void setImage(Drawable drawable) {
            if (drawable == null) {
                throw new IllegalArgumentException("drawable cannot be null.");
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                mGood.setBackground(drawable);
            } else {
                mGood.setBackgroundDrawable(drawable);
            }
            mGood.setText("");
            setWidth(drawable.getIntrinsicWidth());
            setHeight(mDistance + drawable.getIntrinsicHeight());
        }
    
        /**
         * 设置移动距离
         *
         * @param dis
         */
        public void setDistance(int dis) {
            mDistance = dis;
            mToY = dis;
            mChanged = true;
            setHeight(mDistance + mGood.getMeasuredHeight());
        }
    
        /**
         * 设置Y轴移动属性
         *
         * @param fromY
         * @param toY
         */
        public void setTranslateY(int fromY, int toY) {
            mFromY = fromY;
            mToY = toY;
            mChanged = true;
        }
    
        /**
         * 设置透明度属性
         *
         * @param fromAlpha
         * @param toAlpha
         */
        public void setAlpha(float fromAlpha, float toAlpha) {
            mFromAlpha = fromAlpha;
            mToAlpha = toAlpha;
            mChanged = true;
        }
    
        /**
         * 设置动画时长
         *
         * @param duration
         */
        public void setDuration(int duration) {
            mDuration = duration;
            mChanged = true;
        }
    
        /**
         * 重置属性
         */
        public void reset() {
            mText = TEXT;
            mTextColor = TEXT_COLOR;
            mTextSize = TEXT_SIZE;
            mFromY = FROM_Y_DELTA;
            mToY = TO_Y_DELTA;
            mFromAlpha = FROM_ALPHA;
            mToAlpha = TO_ALPHA;
            mDuration = DURATION;
            mDistance = DISTANCE;
            mChanged = false;
            mAnimationSet = createAnimation();
        }
    
        /**
         * 展示
         *
         * @param v
         */
        public void show(View v) {
            if (!isShowing()) {
                int offsetY = -v.getHeight() - getHeight();
                showAsDropDown(v, v.getWidth() / 2 - getWidth() / 2, offsetY);
                if (mAnimationSet == null || mChanged) {
                    mAnimationSet = createAnimation();
                    mChanged = false;
                }
                mGood.startAnimation(mAnimationSet);
            }
        }
    
        /**
         * 动画
         *
         * @return
         */
        private AnimationSet createAnimation() {
            mAnimationSet = new AnimationSet(true);
            TranslateAnimation translateAnim = new TranslateAnimation(0, 0, mFromY, -mToY);
            AlphaAnimation alphaAnim = new AlphaAnimation(mFromAlpha, mToAlpha);
            mAnimationSet.addAnimation(translateAnim);
            mAnimationSet.addAnimation(alphaAnim);
            mAnimationSet.setDuration(mDuration);
            mAnimationSet.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                }
    
                @Override
                public void onAnimationEnd(Animation animation) {
                    if (isShowing()) {
                        new Handler().post(new Runnable() {
                            @Override
                            public void run() {
                                dismiss();
                            }
                        });
                    }
                }
    
                @Override
                public void onAnimationRepeat(Animation animation) {
                }
            });
            return mAnimationSet;
        }
    }
    
    • 常量接口
    package com.smallcake.utils.popup;
    
    import android.graphics.Color;
    
    /**
     * 常量控制
     */
    
    public interface IGoodView {
        int DISTANCE = 60;   // 默认移动距离
    
        int FROM_Y_DELTA = 0; // Y轴移动起始偏移量
    
        int TO_Y_DELTA = DISTANCE; // Y轴移动最终偏移量
    
        float FROM_ALPHA = 1.0f;    // 起始时透明度
    
        float TO_ALPHA = 0.0f;  // 结束时透明度
    
        int DURATION = 1000; // 动画时长
    
        String TEXT = ""; // 默认文本
    
        int TEXT_SIZE = 16; // 默认文本字体大小
    
        int TEXT_COLOR = Color.BLACK;   // 默认文本字体颜色
    }
    
    

    其中的主要方法

    image.png

    相关文章

      网友评论

        本文标题:Android点赞效果

        本文链接:https://www.haomeiwen.com/subject/weugrxtx.html