Android自定义控件ViewFipper实现竖直跑马灯效果

一直想实现一个竖直跑马灯的效果,今天接触到了ViewFlipper这个控件, 是做安卓视图切换的,  对其用自定义控件进行包装;实现其点击回调和自定义视图等功能

不多说,直接上代码:

定义了一个自定义控件,  继承LinearLayout

package com.example.viewfipperdemo; 

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.ViewFlipper; 

/**
 * Created by zmybi on 2017/1/19.
 */ 

public class MarqueeTextView extends LinearLayout { 

 private Context mContext;
 private String[] strs;
 private View mView; 

 private OnTextClickListener mOnTextClickListener;
 private ViewFlipper mViewFlipper; 

 public MarqueeTextView(Context context) {
  this(context,null);
  this.mContext = context;
 } 

 public MarqueeTextView(Context context, AttributeSet attrs) {
  super(context, attrs);
  this.mContext = context; 

  initBasicView();
 } 

 /**
  * 用于外界向里面传值,并且初始化控件中的ViewFipper
  * @param str
  * @param onTextClickListener
  */
 public void setData(String[] str,OnTextClickListener onTextClickListener) {
  this.strs = str;
  this.mOnTextClickListener = onTextClickListener;
  initViewFipper();
 } 

 private void initBasicView() {
  mView = LayoutInflater.from(mContext).inflate(R.layout.layout_viewfipper,null);
  mViewFlipper = (ViewFlipper) mView.findViewById(R.id.viewflipper); 

  mViewFlipper.setInAnimation(mContext,R.anim.in); //进来的动画
  mViewFlipper.setOutAnimation(mContext,R.anim.out); //出去的动画 

  LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  addView(mView,params); 

  mViewFlipper.startFlipping();
 } 

 /**
  * 定义销毁的方法
  */
 public void clearViewFlipper() {
  if(mView != null) {
   if(mViewFlipper != null) {
    mViewFlipper.stopFlipping();
    mViewFlipper.removeAllViews();
    mViewFlipper =null;
   }
   mView = null;
  }
 } 

 /**
  * 初始化viewFipper中的自孩子视图
  */
 private void initViewFipper() {
  if(strs.length == 0) {
   return;
  } 

  int i = 0;
  mViewFlipper.removeAllViews();
  while (i < strs.length) { //循环3次
   final TextView tv = new TextView(mContext);
   tv.setText(strs[i]); 

   tv.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
     if(mOnTextClickListener != null) {
      mOnTextClickListener.onClick(tv);
     }
    }
   });
   mViewFlipper.addView(tv);
   i++;
  } 

 }
}

给viewFlipper设置动画的写法:

in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"> 

 <translate
  android:duration="@android:integer/config_mediumAnimTime"
  android:fromYDelta="50%p"
  android:toYDelta="0" />
 <alpha
  android:duration="@android:integer/config_mediumAnimTime"
  android:fromAlpha="0.0"
  android:toAlpha="1.0" /> 

</set>

out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"> 

 <translate
  android:duration="@android:integer/config_mediumAnimTime"
  android:fromYDelta="0"
  android:toYDelta="-50%p" />
 <alpha
  android:duration="@android:integer/config_mediumAnimTime"
  android:fromAlpha="1.0"
  android:toAlpha="0.0" /> 

</set>

我们看一下layout_viewflipper布局的写法:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"> 

 <ViewFlipper
  android:padding="10dp"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:id="@+id/viewflipper"
  android:background="#33ff0000"
  android:flipInterval="2000"
  ></ViewFlipper> 

</LinearLayout>

其中flipInterval  是决定切换的时间的

我们再来看看MainActivity中的代码:

package com.example.viewfipperdemo; 

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 

 /**
  * 自定义的可滚动的TextView
  */
 private MarqueeTextView mMarqueeTextView; 

 private String[] str = {"我是1","我是2","我是3"}; 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main); 

  mMarqueeTextView = (MarqueeTextView) findViewById(R.id.marqueetextview); 

  mMarqueeTextView.setData(str, new OnTextClickListener() {
   @Override
   public void onClick(View view) {
    Toast.makeText(MainActivity.this,((TextView)view).getText(),Toast.LENGTH_LONG).show();
   }
  });
 } 

 @Override
 protected void onDestroy() {
  super.onDestroy();
  mMarqueeTextView.clearViewFlipper();
 }
}

对了,还定义了一个接口:

package com.example.viewfipperdemo; 

import android.view.View; 

/**
 * Created by zmybi on 2017/1/19.
 */ 

public interface OnTextClickListener { 

 void onClick(View view);
}

至此,如上的竖直跑马灯就完成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android使用TextView跑马灯效果

    老规矩,先上图看效果. 说明 TextView的跑马灯效果也就是指当你只想让TextView单行显示,可是文本内容却又超过一行时,自动从左往右慢慢滑动显示的效果就叫跑马灯效果. 其实,TextView实现跑马灯效果很简单,因为官方已经实现了,你只需要通过设置几个属性即可.而且,相关的资料其实网上也有一大堆了,之所以还写这篇博客出来是因为,网上好多人的博客都是只贴代码的啊,好一点的就是附带几张图片,可是这是动画效果啊,不动起来,谁知道跑马灯效果到底长什么样,到底是不是自己想要的效果啊(不会只有题主

  • Android基于TextView不获取焦点实现跑马灯效果

    本文实例讲述了Android基于TextView不获取焦点实现跑马灯效果.分享给大家供大家参考,具体如下: 1. 写一个类继承TextView package com.example.tt; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.widget.TextView; public class ScrollingText

  • Android TextView跑马灯效果实现方法

    本文实例讲述了Android TextView跑马灯效果实现方法.分享给大家供大家参考,具体如下: public class MyTextView extends TextView{ public MyTextView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public MyTextView(Context context, A

  • Android自定义textview实现竖直滚动跑马灯效果

    本文实例为大家分享了Android自定义textview实现跑马灯效果的具体代码,供大家参考,具体内容如下 xml布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.c

  • Android 实现不依赖焦点和选中的TextView跑马灯

    前言 之前有写一篇TextView跑马灯的效果,后来实际项目中有发现新的问题,比如还是无法自动跑,文本超过了显示区域就截取的问题,今天换了一种思路来实现,更简单更好用. 正文 代码实现: public class MarqueeTextView extends TextView { /** 是否停止滚动 */ private boolean mStopMarquee; private String mText; private float mCoordinateX; private float

  • Android TextView实现跑马灯效果的方法

    本文为大家分享一个非常简单但又很常用的控件,跑马灯状态的TextView.当要显示的文本长度太长,又不想换行时用它来显示文本,一来可以完全的显示出文本,二来效果也挺酷,实现起来超级简单,所以,何乐不为.先看下效果图: 代码实现 TextView自带了跑马灯功能,只要把它的ellipsize属性设置为marquee就可以了.但有个前提,就是TextView要处于被选中状态才能有效果,看到这,我们就很自然的自定义一个控件,写出以下代码: public class MarqueeTextView ex

  • Android 中TextView中跑马灯效果的实现方法

     条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须超出TextView大小 3.TextView要获得焦点才能滚动 mTVText.setText("超过文本长度的数据"); mTVText.setSingleLine(true);设置单行显示 mTVText.setEllipsize(TruncateAt.MARQUEE);设置跑马灯显示效果 TextView.setHorizontallyScrol

  • Android中使用TextView实现文字跑马灯效果

    通常情况下我们想实现文字的走马灯效果需要在xml文件中这样设置 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:ellipsize="marquee" android:focusable="true" android:

  • Android基于TextView实现的跑马灯效果实例

    本文实例讲述了Android基于TextView实现的跑马灯效果.分享给大家供大家参考,具体如下: package sweet.venst.act; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStrea

  • Android基于TextView属性android:ellipsize实现跑马灯效果的方法

    本文实例讲述了Android基于TextView属性android:ellipsize实现跑马灯效果的方法.分享给大家供大家参考,具体如下: Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须超出TextView大小 3.TextView要获得焦点才能滚动 XML代码: android:ellipsize="marquee", andro

随机推荐