主类: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>

结束。

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

  1. 在Android源码树中添加userspace I2C读写工具(i2c-util)

    在Android源码树中添加userspace I2C读写工具(i2c-util) http://blog.csdn.net/21cnbao/article/details/7919055 分类: A ...

  2. Android源码中添加C可执行程序

    在Android源码中添加C/CPP可执行程序一般保存在external目录中 下面是每个文件的内容 ①add.c #include "add.h" int add (int a, ...

  3. 我的Android进阶之旅------>如何在多个LinearLayout中添加分隔线

    如果要适合于所有的Android版本,可以在多个LinearLayout放置用于显示分隔线的View.例如,放一个ImageView组件,然后将其背景设为分隔线的颜色或图像,分隔线View的定义代码如 ...

  4. 在Android 源码中添加系统服务

    Android系统本身提供了很多系统服务,如WindowManagerService,PowerManagerService等.下面描述一下添加一个系统服务的具体步骤. 1.定义自定义系统服务接口 撰 ...

  5. 如何在多个LinearLayout中添加分隔线

      1.可以放置一个ImageView组件,然后将其设为分隔线的颜色或图形.分隔线View的定义代码如下:   2.在Android3.0及以上版本,LinearLayout支持直接显示分隔线. an ...

  6. Android源码中添加APP

    参考罗升阳<Android系统源代码情景分析> 在Android源码中,我们通常把实验性质的Android APP放在packages/experimental目录下.对于一个简单的应用程 ...

  7. Android的LinearLayout中orientation默认值为什么是HORIZONTAL

    在一个偶然(闲着无聊)的过程中,突然非常好奇为什么LinearLayout在不指定排列方向为垂直(VERTICAL)时就得是水平方向(HORIZONTAL)排列的.产生这个疑问的时候脑子里蹦出来的第一 ...

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

    #pragma mark - 添加到购物车的动画效果 // huangyibiao - (void)addAnimatedWithFrame:(CGRect)frame { // 该部分动画 以sel ...

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

    记录一个简单的动画效果,自己写的,很简单,仅做记录. 附一个demo的下载地址: https://github.com/hgl753951/hglTest.git 代码如下: 1,准备 BOOL _i ...

随机推荐

  1. HotSpot 虚拟机对象揭秘【转载】

    对象的创建 Java 对象的创建过程, ①类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过.解 ...

  2. linux学习笔记-安装配置使用clamav杀毒软件

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装clamav 2.更新病毒库 # freshclam 如果更新不了,或者更新特别慢,可以手动下载病毒库文件,放到/var ...

  3. js array 数组添加与删除数据

    //新建数组 var ids =new Array(); //向数组中添加数据 ids.push(1); //删除下标为i的数组元素 ids.remove(i); //自定义删除函数: Array.p ...

  4. linux基础学习之软件安装以及常用命令

    linux基础学习之软件安装以及常用命令 调用中央仓库: yum install wget 然后下载nodejs: wget https://nodejs.org/dist/v10.14.2/node ...

  5. VUE 配置vue-devtools调试工具

    1. 通过 Git 克隆项目到本地 git clone https://github.com/vuejs/vue-devtools.git 2. Git 进入到 vue-devtools 所在目录,然 ...

  6. ArcGIS for Server 的修改IP问题

      ArcGIS for Server 的修改IP问题   1. [arcgisserver@centos6 ~]$ vi /home/arcgisserver/serverconfig/config ...

  7. SVN SVN合并(Merge)与拉取分支(Branch/tag)操作简介

    SVN合并(Merge)与拉取分支(Branch/tag)操作简介 合并(Merge) 例子:把对feature_branch\project_name_v3.3.7_branch的修改合并到deve ...

  8. Testlink Testlink在Windows下的安装

    Testlink在Windows下的安装   by:授客 QQ:1033553122   测试环境 testlink-1.9.14 下载地址:http://pan.baidu.com/s/1pLrcu ...

  9. system.img镜像转换为system.new.dat + system.transfer.list

    android 8.1上面验证,支持所有的android版本,直接放到sdk中执行即可.   img2sdat.py #!/usr/bin/env python #coding=utf-8   imp ...

  10. json替换jsonp实现跨域请求

    最近遇到h5前端页面和web后端双方的请求存在跨域,普通的jquery.ajax请求已不能实现(因为js是不允许跨域的(如果可以跨域,那就能随便改别人的网页了),js的原理), 最后经过艰苦奋斗,终于 ...