开源项目GoodView点赞效果代码明细
扫描二维码
随时随地手机看文章
点赞+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); } }); } }
实践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; /** * 点赞效果 * * @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() { @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; // 默认移动距离 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; @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(); } }