点赞+1效果:

GoodView方法:

使用GoodView的Demo:

public class MainActivity extends Activity {

        @Overrideprotected 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() {@Overridepublic void onClick(View v) {goodView.setText("+1");goodView.show(v);}});}}
<span style="font-family: Arial, Helvetica, sans-serif;">实践GitHub开源GoodView:</span>
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>

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;/*** 点赞效果** @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();}/*** 设置文本** @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*/private void setTextColor(int color) {mTextColor = color;mGood.setTextColor(color);}/*** 设置文本大小** @param textSize*/private 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() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {if (isShowing()) {new Handler().post(new Runnable() {@Overridepublic void run() {dismiss();}});}}@Overridepublic 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;   // 默认移动距离int FROM_Y_DELTA = 0; // Y轴移动起始偏移量int TO_Y_DELTA = DISTANCE; // Y轴移动最终偏移量float FROM_ALPHA = 1.0f;    // 起始时透明度float TO_ALPHA = 0.0f;  // 结束时透明度int DURATION = 800; // 动画时长String TEXT = ""; // 默认文本int TEXT_SIZE = 16; // 默认文本字体大小int TEXT_COLOR = Color.BLACK;   // 默认文本字体颜色}

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;@Overrideprotected 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();}}

开源项目GoodView点赞效果相关推荐

  1. 关于在项目中使用开源项目的疑惑,恳请大家给点意见!

    最近公司准备建立一套标准并严格执行,涉及到搭建系统框架.建立标准内库.建立标准控件库-- 有同事建议采用一些开源的项目,诸如: 1.iBATISNet 2.Ajax.NET Professional ...

  2. 公司开源的java分词,Java开源项目cws_evaluation:中文分词器分词效果评估

    通过对前文<word分词器.ansj分词器.mmseg4j分词器.ik-analyzer分词器分词效果评估>中写的评估程序进行重构改进,形成了一个新的Java开源项目cws_evaluat ...

  3. Android开源项目以及开源框架,各种UI实现效果

    开源项目和开源框架第一期 图片 Android-Universal-Image-Loader★15152 - 异步图像加载程序 glide★15006 - 媒体管理和图片加载框架 picasso★13 ...

  4. android 马赛克 代码,Android_Android 马赛克(Mosaics)效果,前几天看见开源项目效果好赞 - phpStudy...

    Android 马赛克(Mosaics)效果 前几天看见开源项目效果好赞,看了下代码,实现大致就是在原界面之上覆盖一成自定义的View,获取到点击的那个View的内容(Bitmap),然后在覆盖的那个 ...

  5. Android开源项目以及开源框架,各种UI实现效果。

    开源项目和开源框架第一期 图片 Android-Universal-Image-Loader★15152 - 异步图像加载程序 glide★15006 - 媒体管理和图片加载框架 picasso★13 ...

  6. 【Android】开源项目汇总-备用 各种图形的绘制,各种效果

    from://http://www.eoeandroid.com/home.php?mod=space&uid=765778&do=blog&id=47674 Android开 ...

  7. 开源知识管理系统_半个月收获接近 1k 的点赞!你需要的开源项目都在这里

    半个月前,我开源了awesome-java ,这是一个 Github 上非常棒的 Java 开源项目集合.是的!就是下面这个这么骚的图标! 项目地址在这里:https://github.com/Sna ...

  8. 使用开源项目【Banner】实现轮播图效果(带小圆点)

    banner开源项目地址:GitHub - youth5201314/banner:

  9. Android开源项目集合(不断更新)

    Android开源项目集合(不断更新) 女神节快乐~~~ 休息片刻23 PlayAndroid advanced-java FFmpegAndroidCameraEncoder ScaleRuler ...

最新文章

  1. java创建solr core_Solr定义core.properties
  2. HashMap 你真的了解吗?
  3. 美团王庆:当老板对指标进行灵魂拷问时,该如何诊断分析?
  4. ANSYS——“There is at least 1 small equation solver pivot term”问题的解决办法
  5. 什么是协议转换器?协议转换器的定义
  6. 用汇编的眼光看C++(之指针1)
  7. springday04-go1
  8. 个人邮箱怎么申请?个人外贸邮箱推荐
  9. 怎么用计算机算lnx,lnx等于多少怎么算
  10. 又是一年新来到,别墅翻新要趁早
  11. 语言处理 之 melgan
  12. 2021011029王芯悦-实验1
  13. 网站中的新老访客怎么定义,有何区别?
  14. 如何改变视频的MD5值?一分钟让你学会操作
  15. rx.xxx 和 io.reactivex.xxx RxJava1 和 RxJava2 和 RxJava3
  16. LeetCode 427. 建立四叉树
  17. # 后端开发技巧、常用规范
  18. //我一次黑别人的电脑时的技术经过!
  19. 热更新总结--冷启动热更新
  20. 个人中心html更换头像,html5 头像上传更换插件

热门文章

  1. 建立自己的GWT Spring Maven原型
  2. Spring MVC拦截器示例
  3. 后勤管理系统_充满“智慧”的后勤管理系统是什么样的?
  4. unbantu上python安装步骤_如何在Ubuntu中安装Python 3.6?
  5. 数据库中的二级索引_普通索引_辅助索引
  6. Linux 命令之 df -- 显示磁盘空间使用情况
  7. Java包命名规则_包命名规范
  8. centos7设置键盘类型_CentOS 7 系统区域(语言)和键盘设置
  9. python range函数范围_Python range函数
  10. c语言限制字符数,C语言中“不受限制”的字符串函数总结.pdf