開源項(xiàng)目GoodView點(diǎn)贊效果代碼明細(xì)
點(diǎn)贊+1效果:
GoodView方法:
使用GoodView的Demo:
? ?public class MainActivity extends Activity {
????????@Override
????????protected?void?onCreate(Bundle?savedInstanceState)?{
????????????super.onCreate(savedInstanceState);
????????????setContentView(R.layout.activity_main)
????????????final?GoodView?goodView?=?new?GoodView(this);
????????????Button?button?=?new?Button(this);
????????????button.setOnClickListener(new?View.OnClickListener()?{
????????????????@Override
????????????????public?void?onClick(View?v)?{
????????????????????goodView.setText("+1");
????????????????????goodView.show(v);
????????????????}
????????????});
????????}
????}實(shí)踐GitHub開源GoodView:
GoodView.java :
/*
?*?Copyright?(C)?2016?venshine.cn@gmail.com
?*
?*?Licensed?under?the?Apache?License,?Version?2.0?(the?"License");
?*?you?may?not?use?this?file?except?in?compliance?with?the?License.
?*?You?may?obtain?a?copy?of?the?License?at
?*
?*??????http://www.apache.org/licenses/LICENSE-2.0
?*
?*?Unless?required?by?applicable?law?or?agreed?to?in?writing,?software
?*?distributed?under?the?License?is?distributed?on?an?"AS?IS"?BASIS,
?*?WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.
?*?See?the?License?for?the?specific?language?governing?permissions?and
?*?limitations?under?the?License.
?*/
package?sunny.example.opengoodview.goodview;
import?android.annotation.SuppressLint;
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;
/**
?*?點(diǎn)贊效果
?*
?*?@author?venshine
?*/
@SuppressLint("NewApi")
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();
????}
????/**
?????*?設(shè)置文本
?????*
?????*?@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();
????}
????/**
?????*?設(shè)置文本顏色
?????*
?????*?@param?color
?????*/
????private?void?setTextColor(int?color)?{
????????mTextColor?=?color;
????????mGood.setTextColor(color);
????}
????/**
?????*?設(shè)置文本大小
?????*
?????*?@param?textSize
?????*/
????private?void?setTextSize(int?textSize)?{
????????mTextSize?=?textSize;
????????mGood.setTextSize(TypedValue.COMPLEX_UNIT_DIP,?textSize);
????}
????/**
?????*?設(shè)置文本信息
?????*
?????*?@param?text
?????*?@param?textColor
?????*?@param?textSize
?????*/
????public?void?setTextInfo(String?text,?int?textColor,?int?textSize)?{
????????setTextColor(textColor);
????????setTextSize(textSize);
????????setText(text);
????}
????/**
?????*?設(shè)置圖片
?????*
?????*?@param?resId
?????*/
????public?void?setImage(int?resId)?{
????????setImage(mContext.getResources().getDrawable(resId));
????}
????/**
?????*?設(shè)置圖片
?????*
?????*?@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());
????}
????/**
?????*?設(shè)置移動(dòng)距離
?????*
?????*?@param?dis
?????*/
????public?void?setDistance(int?dis)?{
????????mDistance?=?dis;
????????mToY?=?dis;
????????mChanged?=?true;
????????setHeight(mDistance?+?mGood.getMeasuredHeight());
????}
????/**
?????*?設(shè)置Y軸移動(dòng)屬性
?????*
?????*?@param?fromY
?????*?@param?toY
?????*/
????public?void?setTranslateY(int?fromY,?int?toY)?{
????????mFromY?=?fromY;
????????mToY?=?toY;
????????mChanged?=?true;
????}
????/**
?????*?設(shè)置透明度屬性
?????*
?????*?@param?fromAlpha
?????*?@param?toAlpha
?????*/
????public?void?setAlpha(float?fromAlpha,?float?toAlpha)?{
????????mFromAlpha?=?fromAlpha;
????????mToAlpha?=?toAlpha;
????????mChanged?=?true;
????}
????/**
?????*?設(shè)置動(dòng)畫時(shí)長(zhǎng)
?????*
?????*?@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);
????????}
????}
????/**
?????*?動(dòng)畫
?????*
?????*?@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;
????}
}IGoodView.java :
/*
?*?Copyright?(C)?2016?venshine.cn@gmail.com
?*
?*?Licensed?under?the?Apache?License,?Version?2.0?(the?"License");
?*?you?may?not?use?this?file?except?in?compliance?with?the?License.
?*?You?may?obtain?a?copy?of?the?License?at
?*
?*??????http://www.apache.org/licenses/LICENSE-2.0
?*
?*?Unless?required?by?applicable?law?or?agreed?to?in?writing,?software
?*?distributed?under?the?License?is?distributed?on?an?"AS?IS"?BASIS,
?*?WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.
?*?See?the?License?for?the?specific?language?governing?permissions?and
?*?limitations?under?the?License.
?*/
package?sunny.example.opengoodview.goodview;
import?android.graphics.Color;
/**
?*?@author?venshine
?*/
public?interface?IGoodView?{
????int?DISTANCE?=?60;???//?默認(rèn)移動(dòng)距離
????int?FROM_Y_DELTA?=?0;?//?Y軸移動(dòng)起始偏移量
????int?TO_Y_DELTA?=?DISTANCE;?//?Y軸移動(dòng)最終偏移量
????float?FROM_ALPHA?=?1.0f;????//?起始時(shí)透明度
????float?TO_ALPHA?=?0.0f;??//?結(jié)束時(shí)透明度
????int?DURATION?=?800;?//?動(dòng)畫時(shí)長(zhǎng)
????String?TEXT?=?"";?//?默認(rèn)文本
????int?TEXT_SIZE?=?16;?//?默認(rèn)文本字體大小
????int?TEXT_COLOR?=?Color.BLACK;???//?默認(rèn)文本字體顏色
}
MainActivity.java :
/*
?*?Copyright?(C)?2016?venshine.cn@gmail.com
?*
?*?Licensed?under?the?Apache?License,?Version?2.0?(the?"License");
?*?you?may?not?use?this?file?except?in?compliance?with?the?License.
?*?You?may?obtain?a?copy?of?the?License?at
?*
?*??????http://www.apache.org/licenses/LICENSE-2.0
?*
?*?Unless?required?by?applicable?law?or?agreed?to?in?writing,?software
?*?distributed?under?the?License?is?distributed?on?an?"AS?IS"?BASIS,
?*?WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.
?*?See?the?License?for?the?specific?language?governing?permissions?and
?*?limitations?under?the?License.
?*/
package?sunny.example.opengoodview;
import?android.graphics.Color;
import?android.os.Bundle;
import?android.support.v7.app.ActionBarActivity;
//import?android.support.v7.app.AppCompatActivity;
import?android.view.View;
import?android.widget.ImageView;
import?sunny.example.opengoodview.goodview.GoodView;
/**
?*?Demo
?*
?*?@author?venshine
?*/
public?class?MainActivity?extends?ActionBarActivity?{
????GoodView?mGoodView;
????@Override
????protected?void?onCreate(Bundle?savedInstanceState)?{
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.activity_main);
????????mGoodView?=?new?GoodView(this);
????}
????//android:onClick="good"
????public?void?good(View?view)?{
????????((ImageView)?view).setImageResource(R.drawable.good_checked);
????????mGoodView.setText("+1");
????????mGoodView.show(view);
????}
????public?void?good2(View?view)?{
????????((ImageView)?view).setImageResource(R.drawable.good_checked);
????????mGoodView.setImage(getResources().getDrawable(R.drawable.good_checked));
????????mGoodView.show(view);
????}
????public?void?collection(View?view)?{
????????((ImageView)?view).setImageResource(R.drawable.collection_checked);
????????mGoodView.setTextInfo("收藏成功",?Color.parseColor("#f66467"),?12);
????????mGoodView.show(view);
????}
????public?void?bookmark(View?view)?{
????????((ImageView)?view).setImageResource(R.drawable.bookmark_checked);
????????mGoodView.setTextInfo("收藏成功",?Color.parseColor("#ff941A"),?12);
????????mGoodView.show(view);
????}
????public?void?reset(View?view)?{
????????((ImageView)?findViewById(R.id.good)).setImageResource(R.drawable.good);
????????((ImageView)?findViewById(R.id.good2)).setImageResource(R.drawable.good);
????????((ImageView)?findViewById(R.id.collection)).setImageResource(R.drawable.collection);
????????((ImageView)?findViewById(R.id.bookmark)).setImageResource(R.drawable.bookmark);
????????mGoodView.reset();
????}
}




