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>

结束。

时间: 2024-10-07 21:48:58

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

Android Studio-Gradle项目中添加JNI生成文件(.so文件)

当使用gradle时,添加.so和jar包遇到报错: java.lang.UnsatisfiedLinkError: Couldn't load faceppapi: findLibrary returned null 解决办法是将build.gradle写成如下形式: apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { minSdkVersi

我的Android进阶之旅------&gt;如何在多个LinearLayout中添加分隔线

如果要适合于所有的Android版本,可以在多个LinearLayout放置用于显示分隔线的View.例如,放一个ImageView组件,然后将其背景设为分隔线的颜色或图像,分隔线View的定义代码如下: <ImageView android:layout_width="fill_parent" android:layout_height="1dp" android:background="#ffffff" /> 效果如下: 在And

ios开发之--简单动画效果的添加

记录一个简单的动画效果,自己写的,很简单,仅做记录. 附一个demo的下载地址: https://github.com/hgl753951/hglTest.git 代码如下: 1,准备 BOOL _isOpen; NSMutableArray * _btnArray; 2,具体代码 -(void)initUI { _btnArray = [[NSMutableArray alloc]init]; for (int i=0; i<4; i++) { UIButton * btn = [UIButt

iOS添加到购物车的简单动画效果

[objc] view plaincopyprint? [objc] view plaincopyprint? #pragma mark - 添加到购物车的动画效果 // huangyibiao - (void)addAnimatedWithFrame:(CGRect)frame { // 该部分动画 以self.view为参考系进行 frame = [[UIApplication sharedApplication].keyWindow  convertRect:frame fromView:

Android简单动画效果

a1.xml 淡出效果 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha android:duration="500" android:fromAlpha="1.0" android:toAlpha=&qu

Android UI: LinearLayout中layout_weight 属性的使用规则

首先来查看android sdk文档,有这么一段话 LinearLayout also supports assigning a weight to individual children with the android:layout_weight attribute. This attribute assigns an "importance" value to a view in terms of how much space is should occupy on the sc

Android的LinearLayout中的权重android:layout_weight

当前EditText和Button部件只是适应了他们各自内容的大小,如下图所示: 这样设置对按钮来说很合适,但是对于文本框来说就不太好了,因为用户可能输入更长的文本内容.因此如果能够占满整个屏幕宽度会更好.LinearLayout使用权重属性来达到这个目的,你可以使用android:layout_weight属性来设置. 权重的值指的是每个部件所占剩余空间的大小,该值与同级部件所占空间大小有关.就类似于饮料的成分配方:“两份伏特加酒,一份咖啡利口酒”,即该酒中伏特加酒占三分之二.例如,我们设置一

往android主项目中添加辅助项目

一个较大的工程往往需要多个项目组成,便于更好的并行开发和管理,但最后还是要合到一起来发布.那如何往主项目里添加其他辅助项目呢? 通常的做法是将辅助项目打包成jar包,像库一样导入到主项目,但是如果我们想要在主项目中同时编辑辅助项目中的代码,这种做法就有障碍了.eclipse还支持另一种做法:link source,通过连接到辅助项目的源代码目录,我们可以在主项目中查看和编辑辅助项目的代码了,最后还可以一块编译生成,操作如下: 右键项目--build path--link source--brow

Android的LinearLayout中 selector背景颜色

把linearLayout 当成按钮使用,我想通过时间触发动态的改变  linear layout 的背景颜色,通过不同的颜色展示不同的状态, 我想通过selector来实现,但是完全没有效果 我看了下其他的解决方法,都说需要添加点击属性时间,但是我的代码已经添加了 我的 LinearLayout  包含了2个小的 LinearLayout  ,没个小LinearLayout  又包含了9个TextView,这18个TextVIew把我的布局填充满了. 我的想法是,每个TextVIew被点击的时