Androidテキストスクロール効果のいくつかの実現方法(一)

14135 ワード

最近のプロジェクトでは、テキストスクロール通知の効果を利用していますが、まずランニングランプの制限が多すぎて適用されないことを考えて、自分で2つの実現方法を書きました.本編では、最初のスクロール方法を紹介します.
1.scrollTo()メソッドによって実現される.
この方法の原理は、TextViewを搭載する親コントロールが必要で、ここではカスタムRelativeLayoutを使用して、TextViewを追加します.親コントロールRelativeLayoutの継続的なscrollTo()メソッドにより、TextViewスクロール効果を実現します.カスタムRelativeLayoutのonDrawメソッドを書き換えると、onDrawでscrollToを呼び出すとスムーズになります.次はコードです.
    /**
     *    RelativeLayout    , textview     
     * @param context
     * @param width
     * @param height
     */
    public PlayNotifyInnerWindow(Context context) {
        super(context);
        mContext = context;
        // TODO Auto-generated constructor stub
        this.setLayoutParams(newLayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT));//    

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.paly_notiry_text, null);
        tv = (TextView) view.findViewById(R.id.tv_notif);
        this.addView(view);//    
    }

次はテキストスタイルの設定です.
            if (!"".equals(left)) {
                // layoutParams.leftMargin=Integer.parseInt(left);
                layoutParams.setMargins(Integer.parseInt(left),0, 0, 0);//    
            }
            if (!"".equals(right)) {
                layoutParams.setMargins(0, 0, Integer.parseInt(right), 0);//    
            }

            if (!"".equals(left) && !"".equals(right)) {
                layoutParams.setMargins(Integer.parseInt(left), 0,//    
                        Integer.parseInt(right), 0);
            }
            if (!"".equals(bottom)) {
                layoutParams.topMargin = Integer.parseInt(bottom);//    
            } else {
                layoutParams.topMargin = 0;
            }
            msp = new SpannableString(content);
            if (isB == true) {//    

                tv.getPaint().setFakeBoldText(true);
            } else {
                tv.getPaint().setFakeBoldText(false);
            }

            if (isI == true) {//    
                tv.getPaint().setTextSkewX(-0.5f);
            } else {
                tv.getPaint().setTextSkewX(0f);
            }
            if (isU == true) {//      
                tv.getPaint().setUnderlineText(true);
            } else {
                tv.getPaint().setUnderlineText(false);

            }
            //    
            if (mspeed != null && !"".equals(mspeed)) {
                speed = Integer.parseInt(mspeed);
            } else {
                speed = 5;
            }
            //    
            if (cicrle != null && !"".equals(cicrle)) {
                cicle = Integer.parseInt(cicrle);
            } else {
                cicle = 10000;
            }
            //    
            if (bgColor != 0 && isTran == false) {

                this.setBackgroundColor(bgColor);
            } else {
                this.setBackgroundColor(Color.TRANSPARENT);
            }
            if (bgZiti != 0) {
                //        
                msp.setSpan(new ForegroundColorSpan(bgZiti), 0,
                        content.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //          

            } else {
                msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 0,
                        content.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //   

            }
            //    
            if (!"".equals(zihao)) {
                fontSize = Util.px2sp(mContext,
                        Util.sp2px(mContext, Integer.parseInt(zihao)) * rate);
                tv.setTextSize(fontSize);
            } else {
                fontSize = Util
                        .px2sp(mContext, Util.sp2px(mContext, 24) * rate);
                tv.setTextSize(fontSize);
            }
            if (!"".equals(ziti)) {
                Typeface tf = Util.choiceTypeface(ziti);
                tv.setTypeface(tf);//     

            } else {
                msp.setSpan(new TypefaceSpan("monospace"), 0, content.length(),
                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            //    ,        
            tv.setText(msp);
            //       ,  ,  ,  ,  
            FontEffects mFontEffects = new FontEffects(tv, null);
            mFontEffects.setFontEffects(effect);
            i = 0;//       

            this.startScroll();//    
//     
        public void startScroll() {
            this.setVisibility(View.VISIBLE);
            isStop = false;
            invalidate();//    (  onDraw)
        }
@Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        if (!isStop) {
            currentScrollX -= speed;//     
            scrollTo(currentScrollX, 0);
            if (getScrollX() <= -(this.getWidth())) {//                     
                currentScrollX = textWidth;//      
                // return;
                if (i >= cicle - 1) {//           
                    // reach max times
                    stopScroll();
                    // return;
                } else {
                    i++;
                }
            }
            invalidate();
        }
    }

//    
public void stopScroll() {
        isStop = true;
        this.setVisibility(View.GONE);
        // scrollTo(0, 0);
    }

以上が第1の方法の実装で、この方法は単独でスクロールしても問題ありませんが、私たちのプロジェクトにはカスタムコントロールでOnDrawを書き換えるアニメーションがたくさんあるので、アニメーションの衝突があり、カートン現象が発生します.だから後の2つの方法があります.