android动画之通过子线程来实现动画

使用android动画机制,往往是相对于原始位置来进行参照。

这里通过子线程修改物体位置实现动画。

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/show"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="40dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/button1"
        android:onClick="MyCLick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:text="行动" />

    <Button
        android:id="@+id/button2"
        android:onClick="MyCLick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginRight="28dp"
        android:layout_toLeftOf="@+id/button1"
        android:text="获取位置" />

</RelativeLayout>

动画代码:

public class MainActivity extends Activity {

	TextView textView;
	MyRuns myRuns;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		textView = (TextView) findViewById(R.id.show);

		myRuns=new MyRuns(new MyHead(textView, 4, 8), true);//位移动画
	}

	static class MyHead extends Handler {// 坐标动画

		View view;// 操作元素
		float cx;
		float cy;

		public MyHead(View view, float cx, float cy) {
			super();
			this.view = view;
			this.cx = cx;
			this.cy = cy;
		}

		@Override
		public void handleMessage(Message msg) {
			// 更新ui
			view.setX(view.getX() + cx);
			view.setY(view.getY() + cy);
			super.handleMessage(msg);
		}

	}

	// 子线程更新位置
	class MyRuns implements Runnable {//更新UI界面

		MyHead head;
		boolean isFire = false;

		public MyRuns(MyHead head, boolean isFire) {
			super();
			this.head = head;
			this.isFire = isFire;
		}

		public boolean isFire() {
			return isFire;
		}

		public void setFire(boolean isFire) {
			this.isFire = isFire;
		}

		@Override
		public void run() {
			// TODO Auto-generated method stub
			try {
				while (true) {
					if (!isFire) {
						break;//停止动画
					}
					Thread.sleep(80);
					Message message = new Message();
					message.what = 3;
					message.obj = "";
					head.sendMessage(message);
				}
			} catch (Exception e) {
				// TODO: handle exception
			}
		}

	}

	//开始运动
	void StartThreed(MyRuns myRuns){
		myRuns.setFire(true);//开启
		new Thread(myRuns).start();
	}

	public void MyCLick(View view) {
		if (view.getId() == R.id.button1) {
			StartThreed(myRuns);
		} else if (view.getId() == R.id.button2) {
			myRuns.setFire(false);//结束子线程
			Toast.makeText(getApplicationContext(),
					"坐标" + textView.getX() + "||" + textView.getY(),
					Toast.LENGTH_SHORT).show();
		}

	}

}

原文地址:http://sijienet.com/bbs/?leibie=showinfo&id=57
时间: 2024-08-26 04:35:14

android动画之通过子线程来实现动画的相关文章

[Android] 任意时刻从子线程切换到主线程的实现原理及加强版

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.net/qiujuer/article/details/41900879 ========================================================

Android -- ViewRoot,关于子线程刷新UI

Android在4.0之后执行线程更新UI操作会报异常:CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.那么你肯定能看到很多文章说android里子线程不能刷新UI.这句话不能说错,只是有些不太严谨.其实线程能否刷新UI的关键在于ViewRoot是否属于该线程. 首先,CalledFromWrongThreadException这个异

Android 主线程和子线程通信问题

Android 现在不支持View在子线程中创建及调用其方法.如果要实现子线程内容更新之后,将结果及时反馈到主线程中,该如何出来呢? 可以在主线程中创建Handler来实现. 这样子线程的结果,可以通过发消息的形式,通知主线程,然后主线程中去及时更新View控件. Handler的使用方式: mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg);

android 主线程和子线程之间的消息传递

从主线程发送消息到子线程(准确地说应该是非UI线程) package com.zhuozhuo;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.util.Log;import android.view.View;import android.view.Vie

Android主线程、子线程通信(Thread+handler)

Android是基于Java的,所以也分主线程,子线程! 主线程:实现业务逻辑.UI绘制更新.各子线程串连,类似于将军: 子线程:完成耗时(联网取数据.SD卡数据加载.后台长时间运行)操作,类似于小兵: 一.子线程向主线程发消息(Thread+handler): 1.主线程中定义Handler: Java代码   Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.h

Android开发之在子线程中更新UI

转自第一行代码-Android Android是不允许在子线程中进行UI操作的.在子线程中去执行耗时操作,然后根据任务的执行结果来更新相应的UI控件,需要用到Android提供的异步消息处理机制. 代码如下: 1 public class MainActivity extends Activity implements OnClickListener { 2 private static final int UPDATE_TEXT=1; 3 private TextView textView;

[Android] 任意时刻从子线程切换到主线程的实现

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.net/qiujuer/article/details/41599383 ========================================================

Android开发之在子线程中使用Toast

在子线程中使用Toast的时候,出现Force close. 错误提示:Can't create handler inside thread that has not called Looper.prepare() 解决方法: 1 Looper.prepare(); 2 Toast.makeText(ActivityTestActivity.this, "toast", 1).show(); 3 Looper.loop(); 原因: 子线程只是一个普通的线程,其ThreadLoacl中

在子线程中创建Handler和looper并与主线程进行交互

分析完上面那篇文章,基本理解了handler的实现原理,乘热打铁,这里我们利用handler原理,在子线程中创建一个handler和looper 可能很多面试时候问道,子线程中能不能new一个handler ? 答案是可以的,但是因为主线程系统默认在ActivityThread中已将帮我们创建好一个looper和MessagQueue,我们不需要手动去创建 (手动创建会出错,因为一个线程中默认只运行一个looper和MessageQueue,具体见ThreadLocal代码原理), 而子线程中没