1. 程式人生 > >開源專案GoodView點贊效果

開源專案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);
                }
            });

        }
    }
<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 [email protected]
 *
 * 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 [email protected]
 *
 * 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 [email protected]
 *
 * 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();
    }

}


相關推薦

開源專案GoodView效果

點贊+1效果: GoodView方法: 使用GoodView的Demo:    public class MainActivity extends Activity { @Override protected void onCreate(B

bbs專案實現和評論的功能

一、點贊功能  先看下前端的程式碼,如下這段程式碼是我直接從部落格園上爬下來的 <div class="poll clearfix"> <div id="div_digg"> <div c

用Flutter實現一個仿Twitter的效果

  這次依然是補作業,之前在寫仿“探探”左滑/右滑的效果的時候,設計稿底部的喜歡Icon其實是有類似於Twitter點贊那種的動效的,但是因為時間原因我偷懶沒寫。   慣例先上效果圖:   GitHub地址:github.com/yumi0629/Fl…   整體演算法是參照了GitHu

Android效果的實現

先看下點讚的效果圖 首先新增依賴 api 'com.sackcentury:shinebutton:0.2.0' xml佈局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=

仿花束直播效果

這是一個利用貝塞爾曲線實現的仿花束直播的點贊效果,實現該效果涉及到: 1、Random隨機數的使用; 2、ObjectAnimator屬性動畫及插值器的使用; 3、貝塞爾曲線的使用; /** * Created by Administrator on 2018/1/30. * 點

開源專案心得,Java架構必會幾大技術

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!                Java架構必會幾大技術點關於學習架構,必須會的幾點技術 1. java反射技術 2. xml檔案處理 3. properties屬性檔案處理 4. 執行緒安全

Android自定義View教你一步一步實現即刻效果

前言 今天朋友看了HenCoder的自定義View後說,HenCoder對自定義View講的不錯。實踐中仿寫即刻的點贊你有思路嗎,你不實現一下?二話不說,看了朋友手機效果,對他說:實現不難,用到了位移,縮放,漸變動畫和自定義View的基礎用法,好,那我實現一下,剛好加深對自定義View的理解。 素材準備

Android -- 自定義ViewGroup+貝塞爾+屬性動畫實現仿QQ效果

private void init(final Context context) { mStarDrawable = new ArrayList<>(); mInterpolators = new ArrayList<>(); mSt

JavaScript實現效果

1:通過自定義封裝函式來獲取標籤元素;2:建立閉包來實現資料緩衝的效果3:迴圈遍歷按鈕,設定點選事件本文重點:瞭解閉包的作用,通過閉包可以實現資料的緩衝,即外層函式與裡層函式之間的語句在呼叫外層函式時只會執行一次示例程式碼<!DOCTYPE html> <h

android 雙擊動畫效果

1.模仿抖音雙擊點贊效果 public class AnimatorLove extends RelativeLayout { private Context mContext; float[] num = {-30, -20, 0, 20, 30};//隨機

animate.css做效果

nan img ted zip image 源碼下載 。。 下載 mat 花了一晚上研究出來的,感覺還行吧。。。 代碼: 源碼下載: http://image.niunan.net/animatedemo.zipanimate.css做點贊效果

Android自定義控制元件——效果(仿Twitter)

前言 通過自定義控制元件,意欲模仿Twitter的點贊效果。 主要涉及: 1.三次貝塞爾曲線應用; 2.屬性動畫的綜合應用; 3.自定義View流程. 拆解原效果 我們先看一下Twitter上的原版效果是怎樣的. 放大後: 好吧!原速的

仿某直播平臺的效果

現在的直播平臺已經是多的不得了了,而給主播點讚的效果,也是各不相同,今天,我們來自定義一個點讚的效果! 先上效果: 當點選點贊按鈕的時候,就會有不同顏色的心型從底部冒出,並按照不規則的路線運動,在運動過程中,伴隨著各種動畫! 好了,話不多說,直接上程式

Android/安卓仿淘寶直播效果/qq空間效果動畫

之前玩淘寶誤入它的直播頻道,發現它的直播介面的點贊效果挺好看,然後發現QQ控制元件點贊有類似動畫,於是趁有空花了點時間玩玩。 先上個效果圖: 添加了一個按鈕模擬點贊,點選多少次就出現多個水果,他們的運動軌跡和速度是不一樣的,而且帶有淡入淡出效果。這是淘寶直播的效果,qq

Android自定義View效果

上方顯示的動畫部分第二部分最開始我想到的是直接在上方畫一個TextView,然後設定屬性動畫 達到我們的效果,後來思考這種效果最好不增加自身控制元件的大小,假如在上方直接新增TextView那麼必然怎麼整個控制元件的高度,很多這種點讚的效果是放在列表中,高度有限。所以我最後想的是使用PopupWindow來實

android 飄心動畫(直播)效果(三)---相關知識點整理

這篇文章是關於 android 飄心動畫(直播點贊)效果 相關知識點的整理,應為我對動畫相關的部分,不是很熟悉,所以對於第一篇文章上面所涉及的只是進行了總結和整理。 1.android 自定義view之 onMeasure() 可以說過載onMeasure

Android使用富文字實現效果(包含人員的頭像)

這篇文章介紹一下使用富文字實現點贊展示效果(包含點贊人員的頭像),之前使用的是SpannableString寫的,但是隻是實現了顯示預設的小心心和後邊的暱稱,頭像沒有展示展示出來。後來將SpannableString換成了SpannableStringBuild

Android 自定義View 效果

我們的態度是:每天進步一點點,理想終會被實現。 前言 週一又到了,是不是感覺一個週末還沒過咋個都沒了呢?既來之則安之,我們還是來學習點有用的,由於之前無意間看到了一個點讚的效果,感覺多麼高大上的,所以想著自己也來實現一下。因此有了此文,如果文中有錯還望各

自定義控制元件 | 仿《最美有物》效果

前言 最近在跟著Hencode學習自定義控制元件,一直想著自己能夠照著別人寫的demo寫一個好看的View,就科學上網看看了別人的一些demo,看到了一位大神寫的模仿《最美有物》的點贊效果,覺得勝似喜歡,於是也跟著寫了一個demo。主要是看著流程分析自己擼出來

實現動態效果

ret return hit ews doctype interval head obj width 點贊的動態效果,源碼如下: ============== URL.py ================ url(r‘^zan.html$‘, views.zan),