開源項(xiàng)目GoodView點(diǎn)贊效果代碼明細(xì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
點(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è)置移動距離 ?????* ?????*?@param?dis ?????*/ ????public?void?setDistance(int?dis)?{ ????????mDistance?=?dis; ????????mToY?=?dis; ????????mChanged?=?true; ????????setHeight(mDistance?+?mGood.getMeasuredHeight()); ????} ????/** ?????*?設(shè)置Y軸移動屬性 ?????* ?????*?@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è)置動畫時(shí)長 ?????* ?????*?@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; ????} }
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)移動距離 ????int?FROM_Y_DELTA?=?0;?//?Y軸移動起始偏移量 ????int?TO_Y_DELTA?=?DISTANCE;?//?Y軸移動最終偏移量 ????float?FROM_ALPHA?=?1.0f;????//?起始時(shí)透明度 ????float?TO_ALPHA?=?0.0f;??//?結(jié)束時(shí)透明度 ????int?DURATION?=?800;?//?動畫時(shí)長 ????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(); ????} }