<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android智能視圖翻轉(zhuǎn)器

          共 14623字,需瀏覽 30分鐘

           ·

          2021-09-30 20:18

          先看看效果圖吧


          作者在里面封裝一個(gè)文本適配器,直接調(diào)用以下方法即可
          SmartViewFlipper view_flipper = findViewById(R.id.view_flipper);view_flipper.setTextAdapter(Arrays.asList("1 -aaaa","2 -aaaa","3 -aaaa","4 -aaaa"));view_flipper.start();


          快速上手
          設(shè)置滾動(dòng)方向  DIRECTION_TOP   DIRECTION_BOTTOM    DIRECTION_LEFT   DIRECTION_RIGHTsetDirection(SmartViewFlipper.DIRECTION_BOTTOM);每隔多少毫秒滑動(dòng)一次setDelayed(5000);滑動(dòng)時(shí)間setSlidingTime(1000);


          使用方法

          布局控件
                                  <com.xxx.view.SmartViewFlipper                            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">
          <!-- 這個(gè)是圓形圖片控件,復(fù)制代碼可使用其他控件代替 --> <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>


          //數(shù)據(jù)類(lèi) 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; } }
          //查找每頁(yè)的控件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> 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, VH>(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個(gè)view重疊起來(lái)并且顯示的數(shù)據(jù)都一樣。當(dāng)向上滑的時(shí)候把第2個(gè)view放到view1的下面并修改viwe2的數(shù)據(jù),動(dòng)畫(huà)結(jié)束后把viwe1的數(shù)據(jù)修改成viwe2的數(shù)據(jù),然后位置放回原來(lái)的地方。

          這里就是一整個(gè)類(lèi)的代碼直接復(fù)制即可
          /** * 視圖翻轉(zhuǎn)器 * * 注意:建議不要在RecyclerView使用,如果非要使用請(qǐng)調(diào)用setAutoCancel(false); 再調(diào)試關(guān)閉Activity 此類(lèi)的updateView方法是否還會(huì)執(zhí)行 */public class SmartViewFlipper extends FrameLayout {
          private long delayed = 3000; //每隔多少毫秒滑動(dòng)一次 private long slidingTime = 1000; //滑動(dòng)時(shí)間 private boolean isCancel; //是否停止動(dòng)畫(huà) private boolean isAutoCancel = true; //控件銷(xiāo)毀是否自動(dòng)取消動(dòng)畫(huà) private int direction = DIRECTION_TOP; //方向 1 上 2 下 3 左 3 右 private Adapter adapter; private ViewHolder vh1,vh2; private boolean isStart; //是否在啟動(dòng)
          //滑動(dòng)方向常量 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); }
          //每隔多少毫秒滑動(dòng)一次 public void setDelayed(long delayed) { if (delayed > 0) this.delayed = delayed; }
          //滑動(dòng)時(shí)間 public void setSlidingTime(long slidingTime) { this.slidingTime = slidingTime; }
          //設(shè)置背景透明度 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); }
          //設(shè)置滾動(dòng)方向 1 上 2 下 3 左 3 右 public void setDirection(int direction) { if (direction > 4 || direction < 1) { return; } this.direction = direction; }
          //設(shè)置適配器 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<String> data){ setAdapter(new TextAdapter(data)); }
          //控件銷(xiāo)毀是否自動(dòng)取消動(dòng)畫(huà) public void setAutoCancel(boolean autoCancel) { this.isAutoCancel = autoCancel; }
          //停止動(dòng)畫(huà) public void cancel() { isCancel = true; isStart = false; }
          //啟動(dòng) 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(); }
          //是否在啟動(dòng) 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> data; private int index = 0;
          public Adapter(List<DATA> 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> 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(); }
          //修改控件數(shù)據(jù) 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(); } }
          //創(chuàng)建顯示的View public abstract VH createView(Context context);
          }
          public static class ViewHolder { View itemView;
          public ViewHolder(View itemView) { if (itemView == null) { throw new RuntimeException("不能傳入一個(gè)null的view"); } this.itemView = itemView; }
          public <T extends View> 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<String> strings) { super(strings); }
          public TextAdapter(List<String> strings, String textColor) { super(strings); this.textColor = textColor; }
          public TextAdapter(List<String> strings, int textSize) { super(strings); this.textSize = textSize; }
          public TextAdapter(List<String> 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) {
          } }}

          到這里就結(jié)束啦。
          瀏覽 41
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产无码精品区 | 蜜臀久久99精品久久久久酒店更新时间 | 香蕉女人久久 | 国产蜜臀精品一区二区免费 | 狼友视频免费在线观看 |