android 透明度_Android智能视图翻转器
作者在里面封装一个文本适配器,直接调用以下方法即可
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智能视图翻转器相关推荐
- Android 透明度百分比对应的 十六进制
Android 透明度百分比对应的 十六进制 先把结果放在这里,方便大家查询,也方便自己,UI太喜欢用百分比表示了=.=! 透明度百分比对应的十六进制: (说明:百分比计算出来会有小数,按照常规的四舍 ...
- myeclipse中导入android项目后无法视图下查看XML视图
myeclipse中导入android项目后无法视图下查看XML视图 导入项目后重启myeclipse即可,打开xml文件便可视图预览.
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】...
Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】
Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...
- android华为虚拟截屏黑屏,Android截屏表面视图显示黑屏
Android截屏表面视图显示黑屏 我试图通过代码拍摄我的游戏的截图,并通过一个意图来分享它.我能做这些事情,但是截图总是看起来是黑色的.下面是与分享截图相关的代码:View view = MainA ...
- Android@Home与智能家居
何为智能家居? 智能家居是一个居住环境,又称智能住宅.通俗地说,它是融合了自动化控制系统.计算机网络系统.无限传感网络系统.和网络通讯技术于一体的网络化智能化的家居控制系统.智能家居将让用户有更方便的 ...
- android 文本分页显示,Android查看带有列表视图的分页器并动态添加文本
我在一个分片活动中有一个Viewpager,它有一个带有编辑文本和发送按钮的botton框架. 在片段布局中,我有一个ListView,并在片段中附加了一个适配器.现在我正在实现从片段中的Parent ...
- Android实现APK智能安装且安装后自启动,亲测有用!
一.智能安装 (一)什么是智能安装? 最近因为公司需求需要实现智能安装,apk从服务器上下载后,自动打开安装,安装完后自己打开,难了我好长时间才实现的,记录一下. 首先实现有两种方式: 静默安装: 在 ...
- ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析...
Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 分类: Android 2011-09-23 00:59 31568人阅读 评论(42) 收藏 举报 androidclass ...
最新文章
- 全球首款碳纳米管通用计算芯片问世!RISC-V架构,5倍于摩尔定律,Nature连发三文推荐...
- 怎么转换html文件为mp3,如何把音频转换成mp3_音频文件怎么转mp3格式-系统城
- OpenGL创建窗口
- 开发时对业务技术框架的理解
- 如何判断三极管好坏?
- C++模板类之pair
- matlab 求矩阵各行的平均值
- git将本地文件push到阿里云Code:出现Permission denied (publickey)错误
- 达梦数据库大小写这个参数敏感怎样设置
- 半路出家程序员的痛旁人不会懂
- 电机控制基础知识储备
- cacheable更新_详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用
- 仿微信视频通话大小视图切换(SurfaceView实现)
- MongoDB勒索事件中,DBA们到底该学到什么?
- crsctl命令详解(原创)
- 15 三极管主要参数
- IAR 的 Go to Definition of不能正常使用
- linux拆分分区,linux磁盘分割
- Mac OS X Mavericks 迅雷下载地址 ( mac os x 10.9 )
- [Error] 'else' without a previous 'if'
热门文章
- 线性回归与梯度下降算法
- ARP协议,ARP诈骗图
- html表格怎么改圆角边框,Table元素设置圆角border
- mysql多次join后count优化_mysql join count 优化案例
- PAT (Basic Level) Practice (中文)答案合集
- 使用python将数据存入SQLite3数据库
- 《南溪的目标检测学习笔记》——后处理方法的学习笔记
- OpenCV——读取图片的数据类型必须是int8类型吗?
- Python考试基础知识
- postgresql python连接不用把密码写在代码里[.pgpass]