先看看效果图吧

作者在里面封装一个文本适配器,直接调用以下方法即可

SmartViewFlipper view_flipper = findViewById(R.id.view_flipper);view_flipper.setTextAdapter(Arrays.asList("1 -aaaa","2 -aaaa","3 -aaaa","4 -aaaa"));view_flipper.start();
快速上手
设置滚动方向  DIRECTION_TOP   DIRECTION_BOTTOM    DIRECTION_LEFT   DIRECTION_RIGHTsetDirection(SmartViewFlipper.DIRECTION_BOTTOM);每隔多少毫秒滑动一次setDelayed(5000);滑动时间setSlidingTime(1000);
使用方法

布局控件

                                                    android:id="@+id/view_flipper"                            android:background="@drawable/shape_black_radius_100"                            android:layout_marginLeft="@dimen/dp12"                            android:layout_marginTop="@dimen/dp120"                            android:layout_width="wrap_content"                            android:layout_height="@dimen/dp30"/>

item_flipper.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:gravity="center_vertical"    android:layout_width="wrap_content"    android:layout_height="match_parent">    <com.bd_appzq.view.circleimg.CircularImage        android:id="@+id/img"        android:layout_width="@dimen/dp26"        android:layout_height="@dimen/dp26"        android:layout_marginLeft="@dimen/dp2"        android:src="@drawable/ic_empty_head" />    <TextView        android:id="@+id/tv"        android:layout_marginRight="@dimen/dp16"        android:layout_marginLeft="@dimen/dp8"        android:textSize="@dimen/sp11"        android:textColor="@color/white"        android:maxLines="1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/>LinearLayout>
//数据类 class Data{        private String img;        private String text;        public Data(String img, String text) {            this.img = img;            this.text = text;        }        public String getImg() {            return img;        }        public void setImg(String img) {            this.img = img;        }        public String getText() {            return text;        }        public void setText(String text) {            this.text = text;        }    }//查找每页的控件class VH extends SmartViewFlipper.ViewHolder {        CircularImage img;        TextView tv;        public VH(View itemView) {            super(itemView);            img = findViewById(R.id.img);            tv = findViewById(R.id.tv);        }    }

最终使用代码

 List data = Arrays.asList(                new Data("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1529415482,1107411788&fm=26&gp=0.jpg","1.狗狗"),                new Data("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3401053187,2861658565&fm=26&gp=0.jpg","2.狗狗"),                new Data("https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3100300256,2664407905&fm=26&gp=0.jpg","3.狗狗"),                new Data("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1931714271,381023284&fm=26&gp=0.jpg","4.狗狗")        );        SmartViewFlipper view_flipper = findViewById(R.id.view_flipper);        view_flipper.setAdapter(new SmartViewFlipper.Adapter(data) {            @Override            public void updateData(VH vh, Data data, int i) {                Glide.with(thisAct).load(data.img).into(vh.img);                vh.tv.setText(data.text);            }            @Override            public VH createView(Context context) {                View view = LayoutInflater.from(context).inflate(R.layout.item_flipper,null,false);                return new VH(view);            }        });        view_flipper.start();

原理就是2个view重叠起来并且显示的数据都一样。
当向上滑的时候把第2个view放到view1的下面并修改viwe2的数据,
动画结束后把viwe1的数据修改成viwe2的数据,然后位置放回原来的地方。

这里就是一整个类的代码直接复制即可
/** * 视图翻转器 * * 注意:建议不要在RecyclerView使用,如果非要使用请调用setAutoCancel(false); 再调试关闭Activity 此类的updateView方法是否还会执行 */public class SmartViewFlipper extends FrameLayout {    private long delayed = 3000; //每隔多少毫秒滑动一次    private long slidingTime = 1000; //滑动时间    private boolean isCancel; //是否停止动画    private boolean isAutoCancel = true; //控件销毁是否自动取消动画    private int direction = DIRECTION_TOP; //方向 1 上 2 下 3 左 3 右    private Adapter adapter;    private ViewHolder vh1,vh2;    private boolean isStart;  //是否在启动    //滑动方向常量    public static final int DIRECTION_TOP = 1;    public static final int DIRECTION_BOTTOM = 2;    public static final int DIRECTION_LEFT = 3;    public static final int DIRECTION_RIGHT = 4;    public SmartViewFlipper(@NonNull Context context) {        super(context);    }    public SmartViewFlipper(@NonNull Context context, @Nullable AttributeSet attrs) {        super(context, attrs);    }    //每隔多少毫秒滑动一次    public void setDelayed(long delayed) {        if (delayed > 0)            this.delayed = delayed;    }    //滑动时间    public void setSlidingTime(long slidingTime) {        this.slidingTime = slidingTime;    }    //设置背景透明度    public void setBackgroundAlpha(int alpha) {        if (getBackground() != null) {            if (alpha > 255) {                alpha = 255;            } else if (alpha < 0) {                alpha = 0;            }            getBackground().mutate().setAlpha(alpha);        }    }    @Override    public void setBackground(Drawable background) {        super.setBackground(background);        setBackgroundAlpha(175);    }    //设置滚动方向 1 上 2 下 3 左 3 右    public void setDirection(int direction) {        if (direction > 4 || direction < 1) {            return;        }        this.direction = direction;    }    //设置适配器    public void setAdapter(Adapter adapter) {        this.adapter = adapter;        removeAllViews();        vh1 = adapter.createView(getContext());        vh2 = adapter.createView(getContext());        vh1.itemView.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));        vh2.itemView.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));        addView(vh1.itemView);        addView(vh2.itemView);    }    public void setTextAdapter(List data){        setAdapter(new TextAdapter(data));    }    //控件销毁是否自动取消动画    public void setAutoCancel(boolean autoCancel) {        this.isAutoCancel = autoCancel;    }    //停止动画    public void cancel() {        isCancel = true;        isStart = false;    }    //启动    public void start() {        if (adapter == null)  return;        if (isStart){            adapter.refresh();            return;        }        isStart = true;        isCancel = false;        adapter.updateDataE(vh1, adapter.getData());        adapter.updateDataE(vh2, adapter.getData());        updateView();    }    //是否在启动    public boolean isStart() {        return isStart;    }    private void updateView() {        if (isCancel)  return;        postDelayed(new Runnable() {            @Override            public void run() {                if (isCancel)  return;                adapter.addIndex();                switch (direction) {                    case DIRECTION_BOTTOM:                        bottomAnimator();                        break;                    case DIRECTION_LEFT:                        leftAnimator();                        break;                    case DIRECTION_RIGHT:                        rightAnimator();                        break;                    default:                        topAnimator();                        break;                }            }        }, delayed);    }    private void topAnimator() {        ObjectAnimator animator = translationY(vh1.itemView, slidingTime, 0, -vh1.itemView.getHeight());        translationY(vh2.itemView, slidingTime, vh1.itemView.getHeight(), 0);        adapter.updateDataE(vh2, adapter.getData());        animator.addListener(new AnimatorListener() {            @Override            public void onAnimationEnd(Animator animation) {                adapter.updateDataE(vh1, adapter.getData());                vh1.itemView.setTranslationY(0);                updateView();            }        });    }    private void bottomAnimator() {        ObjectAnimator animator = translationY(vh1.itemView, slidingTime, 0, vh1.itemView.getHeight());        translationY(vh2.itemView, slidingTime, -vh1.itemView.getHeight(), 0);        adapter.updateDataE(vh2, adapter.getData());        animator.addListener(new AnimatorListener() {            @Override            public void onAnimationEnd(Animator animation) {                adapter.updateDataE(vh1, adapter.getData());                vh1.itemView.setTranslationY(0);                updateView();            }        });    }    private void leftAnimator() {        ObjectAnimator animator = translationX(vh1.itemView, slidingTime, 0, -getWidth());        translationX(vh2.itemView, slidingTime, getWidth(), 0);        adapter.updateDataE(vh2, adapter.getData());        animator.addListener(new AnimatorListener() {            @Override            public void onAnimationEnd(Animator animation) {                adapter.updateDataE(vh1, adapter.getData());                vh1.itemView.setTranslationX(0);                updateView();            }        });    }    private void rightAnimator() {        vh2.itemView.setVisibility(INVISIBLE);        adapter.updateDataE(vh2, adapter.getData());        vh2.itemView.post(new Runnable() {            @Override            public void run() {                vh2.itemView.setVisibility(VISIBLE);                ObjectAnimator animator = translationX(vh1.itemView, slidingTime, 0, getWidth());                translationX(vh2.itemView, slidingTime, -getWidth(), 0);                animator.addListener(new AnimatorListener() {                    @Override                    public void onAnimationEnd(Animator animation) {                        adapter.updateDataE(vh1, adapter.getData());                        vh1.itemView.setTranslationX(0);                        updateView();                    }                });            }        });    }    private ObjectAnimator translationY(View view, long duration, float... values) {        ObjectAnimator translationYAni = ObjectAnimator.ofFloat(view, "translationY", values);        translationYAni.setDuration(duration);        translationYAni.start();        return translationYAni;    }    private ObjectAnimator translationX(View view, long duration, float... values) {        ObjectAnimator translationYAni = ObjectAnimator.ofFloat(view, "translationX", values);        translationYAni.setDuration(duration);        translationYAni.start();        return translationYAni;    }    @Override    protected void dispatchDraw(Canvas canvas) {        float roundSize = getMeasuredWidth() /2;        //切圆角        Path path = new Path();        path.addRoundRect(new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()), roundSize, roundSize, Path.Direction.CW);        canvas.clipPath(path, Region.Op.REPLACE);        super.dispatchDraw(canvas);    }    @Override    protected void onDetachedFromWindow() {        super.onDetachedFromWindow();        if (isAutoCancel) {            cancel();        }    }    public abstract static class Adapter<DATA, VH extends ViewHolder> {        private List data;        private int index = 0;        public Adapter(List data) {            this.data = data;        }        public Adapter() {        }        public void refresh() {            index = 0;        }        public void addIndex() {            index++;            if (index >= getSize()) {                index = 0;            }        }        public void setData(List data) {            this.data = data;        }        public DATA getData() {            if (data == null) {                return null;            }            return data.get(index);        }        public int getSelectIndex() {            return index;        }        public int getSize() {            return data == null ? 0 : data.size();        }        //修改控件数据        public abstract void updateData(VH vh, DATA data);        public final void updateDataE(VH vh, DATA data){            try {                updateData(vh,data);            } catch (Exception e) {                e.printStackTrace();            }        }        //创建显示的View        public abstract VH createView(Context context);    }    public static class ViewHolder {        View itemView;        public ViewHolder(View itemView) {            if (itemView == null) {                throw new RuntimeException("不能传入一个null的view");            }            this.itemView = itemView;        }        public T findViewById(int id) {            return itemView.findViewById(id);        }    }    public static class TextAdapter extends Adapter<String, TextAdapter.VH> {        private String textColor = "#FFFFFF";        private int textSize = 14;        public TextAdapter(List strings) {            super(strings);        }        public TextAdapter(List strings, String textColor) {            super(strings);            this.textColor = textColor;        }        public TextAdapter(List strings, int textSize) {            super(strings);            this.textSize = textSize;        }        public TextAdapter(List strings, String textColor, int textSize) {            super(strings);            this.textColor = textColor;            this.textSize = textSize;        }        @Override        public void updateData(VH vh, String s) {            TextView tv = (TextView) vh.itemView;            tv.setText(s);        }        @Override        public VH createView(Context context) {            TextView tv = new TextView(context);            tv.setTextColor(Color.parseColor(textColor));            tv.setGravity(Gravity.CENTER);            tv.setTextSize(textSize);            tv.setMaxLines(1);            VH vh = new VH(tv);            return vh;        }        class VH extends ViewHolder {            public VH(View itemView) {                super(itemView);            }        }    }    private abstract class AnimatorListener implements Animator.AnimatorListener {        @Override        public void onAnimationStart(Animator animation) {        }        @Override        public void onAnimationCancel(Animator animation) {        }        @Override        public void onAnimationRepeat(Animator animation) {        }    }}

到这里就结束啦。往期精彩回顾:

  • Android实现短信验证码自动填充功能

  • Android仿echo精美弹幕功能

  • Android实现头像重叠排列功能

  • Android仿QQ个性标签功能

  • Android仿QQ侧滑删除的功能

android 透明度_Android智能视图翻转器相关推荐

  1. Android 透明度百分比对应的 十六进制

    Android 透明度百分比对应的 十六进制 先把结果放在这里,方便大家查询,也方便自己,UI太喜欢用百分比表示了=.=! 透明度百分比对应的十六进制: (说明:百分比计算出来会有小数,按照常规的四舍 ...

  2. myeclipse中导入android项目后无法视图下查看XML视图

    myeclipse中导入android项目后无法视图下查看XML视图 导入项目后重启myeclipse即可,打开xml文件便可视图预览.

  3. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】...

    Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...

  4. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】

    Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...

  5. android华为虚拟截屏黑屏,Android截屏表面视图显示黑屏

    Android截屏表面视图显示黑屏 我试图通过代码拍摄我的游戏的截图,并通过一个意图来分享它.我能做这些事情,但是截图总是看起来是黑色的.下面是与分享截图相关的代码:View view = MainA ...

  6. Android@Home与智能家居

    何为智能家居? 智能家居是一个居住环境,又称智能住宅.通俗地说,它是融合了自动化控制系统.计算机网络系统.无限传感网络系统.和网络通讯技术于一体的网络化智能化的家居控制系统.智能家居将让用户有更方便的 ...

  7. android 文本分页显示,Android查看带有列表视图的分页器并动态添加文本

    我在一个分片活动中有一个Viewpager,它有一个带有编辑文本和发送按钮的botton框架. 在片段布局中,我有一个ListView,并在片段中附加了一个适配器.现在我正在实现从片段中的Parent ...

  8. Android实现APK智能安装且安装后自启动,亲测有用!

    一.智能安装 (一)什么是智能安装? 最近因为公司需求需要实现智能安装,apk从服务器上下载后,自动打开安装,安装完后自己打开,难了我好长时间才实现的,记录一下. 首先实现有两种方式: 静默安装: 在 ...

  9. ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析...

    Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 分类: Android 2011-09-23 00:59 31568人阅读 评论(42) 收藏 举报 androidclass ...

最新文章

  1. 全球首款碳纳米管通用计算芯片问世!RISC-V架构,5倍于摩尔定律,Nature连发三文推荐...
  2. 怎么转换html文件为mp3,如何把音频转换成mp3_音频文件怎么转mp3格式-系统城
  3. OpenGL创建窗口
  4. 开发时对业务技术框架的理解
  5. 如何判断三极管好坏?
  6. C++模板类之pair
  7. matlab 求矩阵各行的平均值
  8. git将本地文件push到阿里云Code:出现Permission denied (publickey)错误
  9. 达梦数据库大小写这个参数敏感怎样设置
  10. 半路出家程序员的痛旁人不会懂
  11. 电机控制基础知识储备
  12. cacheable更新_详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用
  13. 仿微信视频通话大小视图切换(SurfaceView实现)
  14. MongoDB勒索事件中,DBA们到底该学到什么?
  15. crsctl命令详解(原创)
  16. 15 三极管主要参数
  17. IAR 的 Go to Definition of不能正常使用
  18. linux拆分分区,linux磁盘分割
  19. Mac OS X Mavericks 迅雷下载地址 ( mac os x 10.9 )
  20. [Error] 'else' without a previous 'if'

热门文章

  1. 线性回归与梯度下降算法
  2. ARP协议,ARP诈骗图
  3. html表格怎么改圆角边框,Table元素设置圆角border
  4. mysql多次join后count优化_mysql join count 优化案例
  5. PAT (Basic Level) Practice (中文)答案合集
  6. 使用python将数据存入SQLite3数据库
  7. 《南溪的目标检测学习笔记》——后处理方法的学习笔记
  8. OpenCV——读取图片的数据类型必须是int8类型吗?
  9. Python考试基础知识
  10. postgresql python连接不用把密码写在代码里[.pgpass]