Android_弾幕効果_勉強します


//*@著者:西野奈留@ブログ:http://blog.csdn.net/narunishino @声明:本文は【CSDNブログ】のみで発表します.
添付:
  • 本文はただ原文の一部の内容に対して説明と修正を加えるだけであり、原文を見るには移動してください.http://blog.csdn.net/books1958/article/details/46375591
  • 画像は、原文から来ています.
  • Android_弹幕_效果_学习_第1张图片
    【全部で5つのクラス:MainActivity.java;TanmuBen.java;ScrenUtils.java;Animation Helper.java;Decell atle Interporation.java.
    【運転ロジック:
  • ボタンをクリックします.
  • 「ワークスレッド」を新設しました.
  • 『ワークスレッド』でポーリングして『弾幕はいくつありますか?』を見てください.
  • は500ミリ秒ごとに、『いくつの弾幕があるか』をハンドルに送信します.
  • handleMessageは、メッセージを受信すると、アニメーション(弾幕)が表示されます.
  • を選択します
    1.MainActivity.java;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.os.SystemClock;
    import android.support.v7.app.AppCompatActivity;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.animation.Animation;
    import android.view.animation.TranslateAnimation;
    import android.widget.FrameLayout;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    import java.lang.ref.WeakReference;
    import java.util.HashSet;
    import java.util.Set;
    
    public class MainActivity extends AppCompatActivity {
    
        private MyHandler handler;
        /** *      */
        private TanmuBean tanmuBean;
        /** *          【containerVG】 */
        private RelativeLayout containerVG;
    
        //【containerVG】   
        private int validHeightSpace;
    
        private View startTanmuView;
    
        private FrameLayout frameLayout;
    
        //-----------------------   ----------------------------
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initFrameTest();
            init();
    
            /** *            */
            startTanmuView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /** *        view   return(do nothing) */
                    if (containerVG.getChildCount() > 0) {
                        return;
                    }
                    /** *   【Set  】       ; */
                    existMarginValues.clear();
                    /** *       【    】 */
                    new Thread(new CreateTanmuThread()).start();
                }
            });
        }
    
        //-----------------------   ----------------------------
    
        /** *          ,      ,    。 */
        private void initFrameTest() {
            TextView textViewFrame = new TextView(this);
            textViewFrame.setTextSize(30);
            textViewFrame.setText("    test ");
            textViewFrame.setTextColor(Color.parseColor("#000000"));
    
            frameLayout = (FrameLayout) findViewById(R.id.frame_container_test);
    
            FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            textViewFrame.setLayoutParams(lp);
    
            Animation animation = new TranslateAnimation(1080, -1080, 0, 0);
            animation.setDuration(3000);
            animation.setRepeatCount(20);
            textViewFrame.startAnimation(animation);
    
            frameLayout.addView(textViewFrame);
        }
    
        //-----------------------   ----------------------------
    
        /** *     */
        private void init() {
    
            containerVG = (RelativeLayout) findViewById(R.id.tanmu_container);
            startTanmuView = findViewById(R.id.startTanmu);
            handler = new MyHandler(this);
            tanmuBean = new TanmuBean();
            /** *       */
            tanmuBean.setItems(new String[]{"I need your help.", "    ",
                    "          ", "        ~~",
                    "   --------------------------" +
                            "-------------   ",
                    "         ?  !", "          ?", "I need your help.",
                    "    ", "          ", "        ~~", "         ?  !",
                    "          ?", "I need your help.",
                    "    ", "          ", "        ~~",
                    "         ?  !", "          ?", "I need your help.", "    ",
                    "          ", "        ~~",
                    "         ?  !", "          ?", "I need your help.",
                    "    ", "          ", "        ~~", "         ?  !",
                    "          ?", "I need your help.",
                    "    ", "          ", "        ~~",
                    "         ?  !", "          ?", "I need your help."});
        }
    
        //-----------------------   ----------------------------
    
        private class CreateTanmuThread implements Runnable {
            @Override
            public void run() {
                /** *   【tanmuBean.getItems()】 *         */
                int N = tanmuBean.getItems().length;
                for (int i = 0; i < N; i++) {
                    /** * public final Message obtainMessage (int what, int arg1, int arg2) * 【obtainMessage().sendToTarget()】   【sendMessage()】,         *   :    【  】  【handler】     【  】 */
                    handler.obtainMessage(1, i, 0).sendToTarget();
                    /** *   【Thread.sleep(500)】;        【InterruptedException】 *   : 0.5s         */
                    SystemClock.sleep(500);
                }
            }
        }
    
        //-----------------------   ----------------------------
    
        private static class MyHandler extends Handler {
            private WeakReference<MainActivity> ref;
    
            MyHandler(MainActivity ac) {
                ref = new WeakReference<>(ac);
            }
    
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1) {
                    MainActivity ac = ref.get();
                    if (ac != null && ac.tanmuBean != null) {
                        int index = msg.arg1;
                        /** *           */
                        String content = ac.tanmuBean.getItems()[index];
                        /** * Math.random()  【0 1】     , *       【16 24】     。 */
                        float textSize = (float) (ac.tanmuBean.getMinTextSize() * (1 + Math.random() * ac.tanmuBean.getRange()));
                        /** *   【  】 */
                        int textColor = ac.tanmuBean.getColor();
    
                        ac.showTanmu(content, textSize, textColor);
                    }
                }
            }
        }
    
        //-----------------------   ----------------------------
    
        private void showTanmu(String content, float textSize, int textColor) {
    
            final TextView textView = new TextView(this);
            textView.setTextSize(textSize);
            textView.setText(content);
            textView.setTextColor(textColor);
    
            /** * 【containerVG.getRight()】:【containerVG】       【   】       。 * 【containerVG.getPaddingLeft()】:【containerVG】       【padding】,      0. *   :         。 */
            int leftMargin = containerVG.getRight() - containerVG.getLeft() - containerVG.getPaddingLeft();
    
            //       topMargin(   ,            )
            /** * 【getRandomTopMargin()】returns 【marginValue】. * 【marginValue】 textView  【containerVG】     。 */
            int verticalMargin = getRandomTopMargin();
            /** *         【getTag】 */
            textView.setTag(verticalMargin);
    
            /** * LayoutParams(int w, int h) *   【RelativeLayout】  【containerVG】,  ,  【showTanmu  】       , * 【containerVG.addView(textView)】: 【textView】add    RelativeLayout   。 *  【new RelativeLayout.LayoutParams()】          (   textView)  RelativeLayout   。 */
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams
                    (RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            /** * 【params.addRule(RelativeLayout.ALIGN_PARENT_TOP)】 *    【textView】    【relativeLayout】     */
            params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
            params.topMargin = verticalMargin;
            /** *   【textView】    */
            textView.setLayoutParams(params);
            textView.setGravity(Gravity.CENTER_HORIZONTAL);
    
            /** * 【leftMargin】      【containerVG】      。 */
            Animation anim = AnimationHelper.createTranslateAnim(this, leftMargin, -ScreenUtils.getScreenW(this));
    
            /** * 【    】   【http://www.imooc.com/video/7362】 */
            anim.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
    
                }
    
                @Override
                public void onAnimationEnd(Animation animation) {
                    //     
                    containerVG.removeView(textView);
                    //    
                    int verticalMargin = (int) textView.getTag();
                    existMarginValues.remove(verticalMargin);
                }
    
                @Override
                public void onAnimationRepeat(Animation animation) {
    
                }
            });
            textView.startAnimation(anim);
    
            containerVG.addView(textView);
        }
    
        //-----------------------   ----------------------------
    
        //                (    )
        private Set<Integer> existMarginValues = new HashSet<>();
        private int linesCount;
    
        private int getRandomTopMargin() {
            if (validHeightSpace == 0) {
                /** * 【containerVG.getBottom()】:【containerVG】               。 *   :  【containerVG】   。 */
                validHeightSpace = containerVG.getBottom() - containerVG.getTop()
                        - containerVG.getPaddingTop() - containerVG.getPaddingBottom();
            }
    
            if (linesCount == 0) {
                /** * 【tanmuBean.getMinTextSize() * (1 + tanmuBean.getRange())】=【16*1.5】=24 *        【linesCount】 */
                linesCount = validHeightSpace / ScreenUtils.dp2px(this, tanmuBean.getMinTextSize() * (1 + tanmuBean.getRange()));
                if (linesCount == 0) {
                    throw new RuntimeException("Not enough space to show text.");
                }
            }
    
            //    
            while (true) {
                /** *   【linesCount】 5 , 【randomIndex】     {0,1,2,3,4,5}      (  )。 * (int)        。 :1.X   1;0.X   0。 */
                int randomIndex = (int) (Math.random() * linesCount);
    
                /** * 【   】  【  】=【     】。 * 【     】  【   】=【marginValue】 * 【marginValue】 textView  【containerVG】     。 */
                int marginValue = randomIndex * (validHeightSpace / linesCount);
    
                /** * boolean contains(Object o)     set       ,    true。 * 【Set  】【existMarginValues】      【marginValue  】 , *            【  】  【TextView】 */
                if (!existMarginValues.contains(marginValue)) {
                    existMarginValues.add(marginValue);
                    return marginValue;
                }
            }
        }
    
        //-----------------------   ----------------------------
    }
    
    2.TanmuBean.java
    import android.graphics.Color;
    
    public class TanmuBean {
    
        private String[] items;
        private int color;
        private int minTextSize;
        private float range;
    
        public TanmuBean() {
            //init default value
            color = Color.parseColor("#444444");
            minTextSize = 16;
            range = 0.5f;
        }
    
        public String[] getItems() {
            return items;
        }
    
        public void setItems(String[] items) {
            this.items = items;
        }
    
        public int getColor() {
            return color;
        }
    
        public void setColor(int color) {
            this.color = color;
        }
    
        public int getMinTextSize() {
            return minTextSize;
        }
    
        /** *   【  】    ,             */
        public void setMinTextSize(int minTextSize) {
            this.minTextSize = minTextSize;
        }
    
        public float getRange() {
            return range;
        }
    
        /** *   【  】    ,             */
        public void setRange(float range) {
            this.range = range;
        }
    }
    
    3.ScrenUtils.java
    import android.content.Context;
    import android.util.DisplayMetrics;
    import android.util.Log;
    
    public class ScreenUtils {
    
        private static int screenW;
        private static int screenH;
        private static float screenDensity;
    
        public static int getScreenW(Context context) {
            if (screenW == 0) {
                initScreen(context);
            }
            /** * 【screenW】   【  】 */
            return screenW;
        }
    
        public static int getScreenH(Context context) {
            if (screenH == 0) {
                initScreen(context);
            }
            return screenH;
        }
    
        public static float getScreenDensity(Context context) {
            if (screenDensity == 0) {
                initScreen(context);
            }
            return screenDensity;
        }
    
        public static void initScreen(Context context) {
            DisplayMetrics metric = context.getResources().getDisplayMetrics();
            screenW = metric.widthPixels;
            screenH = metric.heightPixels;
            screenDensity = metric.density;
        }
    
        /** *            dp         px(  ) */
        public static int dp2px(Context context, float dpValue) {
            return (int) (dpValue * getScreenDensity(context) + 0.5f);
        }
    
        /** *            px(  )         dp */
        public static int px2dp(Context context, float pxValue) {
            return (int) (pxValue / getScreenDensity(context) + 0.5f);
        }
    }
    
    4.Animation Helper.java
    import android.content.Context;
    import android.view.animation.Animation;
    import android.view.animation.TranslateAnimation;
    
    /** *       */
    public class AnimationHelper {
        /** *        */
        public static Animation createTranslateAnim(Context context, int fromX, int toX) {
            /** *      fromXDelta       X         *      toXDelta       X         *      fromYDelta      Y         *      toYDelta      Y         * TranslateAnimation(float fromXDelta, float toXDelta,float fromYDelta, float toYDelta) */
            TranslateAnimation tlAnim = new TranslateAnimation(fromX, toX, 0, 0);
            /** * 【setDuration()】         。 * 【setInterpolator()】      。 * 【setFillAfter()】 View                 。 */
            tlAnim.setDuration(4000);
            tlAnim.setInterpolator(new DecelerateAccelerateInterpolator());
            tlAnim.setFillAfter(true);
            tlAnim.setFillEnabled(true);
    
            return tlAnim;
        }
    }
    
    5.Decellerate Accellerate Interport.java
    import android.view.animation.Interpolator;
    /** * 【Interpolator】        ,      。 */
    public class DecelerateAccelerateInterpolator implements Interpolator {
        @Override
        public float getInterpolation(float input) {
            /** *  【input】return        【  】    。 */
            return input;
        }
    }
    参考:『多くの文章を参考にしましたが、一つ一つ書きません.必要なものがあれば、補足に連絡してください.』
    -2015/12/04--End-