zoukankan      html  css  js  c++  java
  • android 给LinearLayout中添加一定数量的控件,并让着一定数量的控件从右到左移动,每隔若干秒停顿一下,最后一个view链接第一个view,然后继续移动循环往复,形成一个死循环简单动画效果

    主类:IndexAnimationLinearLayout.java

    package com.yw.sortlistview;
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.os.Handler;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    
    import com.yw.sortlistview.bean.AnimationBean;
    
    /**
     * 移动动画
     * 
     * @author tony
     * 
     */
    @SuppressLint("NewApi")
    public class IndexAnimationLinearLayout extends LinearLayout {
        // 外层循环
        private boolean flag = true;
        // 内层if
        private boolean flagIf = true;
        private Context context;
        private List<AnimationBean> datas  = new ArrayList<AnimationBean>();
        public IndexAnimationLinearLayout(Context context) {
            super(context);
            this.context = context;
        }
        
        public IndexAnimationLinearLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.context = context;
        }
    
        public IndexAnimationLinearLayout(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            this.context = context;
        }
        public void setResource(List<AnimationBean> datas){
            this.datas = datas;
        }
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
        }
    
        // 粗略
        private int var = 5;
    
        /**
         * 移动子控件
         */
        public void moveChild() {
            // 获取布局中的控件个数
            int count = this.getChildCount();
            View first = this.getChildAt(0);
            for (int i = 0; i < count; i++) {
                if (first.getRight() <= 0) {
                    this.removeView(first);
                    this.addView(first, this.getChildCount());
                    onStop();
                    /**
                     * 控件停止滚动时切换到不同的视图
                     */
                    if (callback != null) {
                        callback.stop();
                    }
                } else {
                    /*
                     * 左、上、右、下 控制上下不变,左右改变
                     */
                    View view = this.getChildAt(i);
                    view.layout(view.getLeft() - var, view.getTop(),
                            view.getRight() - var, view.getBottom());
                    // 如果view不再Layout范围,则移除
                    Log.e("view.getRight", view.getRight() + "");
                    Log.e("this.getLeft", this.getLeft() + "");
                }
    
            }
        }
    
        public void start(int w) {
            //向集合中添加数据
            if(datas != null && datas.size()>0){
                for(int i=0;i<datas.size();i++){
                    Log.e("startview", "startview");
                    ImageView img = (ImageView)LayoutInflater.from(context).inflate(R.layout.item, null);
                    img.setImageResource(datas.get(i).getResId());
                    /*img.setLayoutParams(new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT));*/
                    img.setLayoutParams(new LinearLayout.LayoutParams(
                            w,
                            w));
                    Log.e("endview", "endview");
                    Log.e("resid", datas.get(i).getResId()+"dd");
                    this.addView(img);
                }
            }
            new Thread() {
                public void run() {
                    try {
                        while (flag) {
                            if (flagIf) {
                                Thread.sleep(200);
                                handler.sendEmptyMessage(0);
                            }
                        }
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                };
            }.start();
        }
        public void stop() {
            flagIf = false;
            flag = false;
        }
        private void onStop() {
    //        Toast.makeText(context, "暂停三秒试试看", Toast.LENGTH_LONG).show();
            new Thread() {
                public void run() {
                    try {
                        flagIf = false;
                        Thread.sleep(2000);
                        flagIf = true;
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                };
            }.start();
        }
    
        Handler handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case 0:
                    moveChild();
                    break;
                }
            };
        };
        private MyLinearLayoutCallBack callback;
    
        public void setMyLinearLayoutCallBack(MyLinearLayoutCallBack callback) {
            this.callback = callback;
        }
    
        public interface MyLinearLayoutCallBack {
    
            public void stop();
        }
    }

    使用类:LayoutAnimationActivity.java

    package com.yw.sortlistview;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.util.Log;
    import android.view.Display;
    import android.view.WindowManager;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.yw.sortlistview.IndexAnimationLinearLayout.MyLinearLayoutCallBack;
    import com.yw.sortlistview.bean.AnimationBean;
    
    /**
     * 控件循环滚动
     * 
     * @author tony
     * 
     */
    public class LayoutAnimationActivity extends Activity implements
            MyLinearLayoutCallBack {
        private IndexAnimationLinearLayout linear;
        private TextView tv_title;
        private List<AnimationBean> datas = new ArrayList<AnimationBean>();
        private int w = 0;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.layoutanimation_layout);
            linear = (IndexAnimationLinearLayout) findViewById(R.id.layoutanimation_linear);
            linear.setMyLinearLayoutCallBack(this);
            tv_title = (TextView)findViewById(R.id.layoutanimation_tv_title);
            
            getScreenHW(this);
            
        }
        public void getScreenHW(Context context){
            WindowManager manager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
            Display display = manager.getDefaultDisplay();
            int width =display.getWidth();
            int height=display.getHeight();
            w = (int)width/8;
        }
        /**
         * 开始动画
         */
        @Override
        protected void onResume() {
            super.onResume();
            for(int i=0;i<10;i++){
                AnimationBean bean = new AnimationBean();
                bean.setId(i+"");
                bean.setResId(R.drawable.ic_launcher);
                datas.add(bean);
            }
            linear.setResource(datas);
            linear.start(w);
        }
        /**
         * 暂停动画
         */
        protected void onStop() {
            super.onStop();
            linear.stop();
        }
        /**
         * 动画停止时的回调函数
         */
        @Override
        public void stop() {
            tv_title.setText("");
            Toast.makeText(this, "暂停三秒试试看", Toast.LENGTH_LONG).show();
        };
    }

    在xml中的使用方法:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical" >
    
        <com.yw.sortlistview.IndexAnimationLinearLayout
            android:id="@+id/layoutanimation_linear"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#ffff99"
            android:orientation="horizontal" >
    
          
        </com.yw.sortlistview.IndexAnimationLinearLayout>
        <TextView 
            android:id="@+id/layoutanimation_tv_title"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:layout_marginTop="10dp"
            android:text="第一个"
            />
    </LinearLayout>

    结束。

  • 相关阅读:
    在CSS里加下面任何一行代码都可以解决图片之间的间隙
    MasterPage Toolbar
    图解虚拟机VMware服务自动启动
    WSUS完全部署
    DIV全屏覆盖网页
    大型架构.net平台篇(WEB层均衡负载nginx)
    组策略设置及导出导入方法[附上设置好的组策略]
    如何設定定時關機?
    gridview获取当前行索引的方法
    no suject
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/3986152.html
Copyright © 2011-2022 走看看