自动移动的ImageView
图片会慢慢的向左移动,到头了后,再循环
其实这个效果和屏幕背景图片的效果差不多,屏幕背景图是随着滑动来慢慢的滚动,这是自己每个n秒开始动。实现方式自然是用自定的控件了。这次继承的是ImageView,实现原理是用一个handler来更新x坐标,没隔10毫秒来通知下handler,让其计算下x坐标的值。然后通过invalidate();方法来通知重新绘制图片,这样就能多次调用onDraw()方法了。
MyImageView.java
package com.kale.imageview03; import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; import android.widget.ImageView; /** * @author wulianghuan * 该类为自定义ImageView,用于显示背景图片,并显示背景图片到移动效果 * */ public class MyImageView extends ImageView{ private Bitmap back; //背景图片资源 private Bitmap mBitmap; //生成位图 private double startX = 0; //移动起始X坐标 //构造函数中必须有context,attributeSet这两个 参数,否则父类无法调用 public MyImageView(Context context,AttributeSet attributeSet) { super(context, attributeSet); //由于不是Activity子类,只能通过DisplayMetrics来获取屏幕信息 DisplayMetrics dm = getResources().getDisplayMetrics(); //屏幕宽度 int screenWidth = dm.widthPixels; //屏幕高度 int screenHeight = dm.heightPixels; back = BitmapFactory.decodeResource(context.getResources(), R.drawable.rootblock_default_bg); //将图片拉伸至屏幕的三倍宽 mBitmap = Bitmap.createScaledBitmap(back, screenWidth*3, screenHeight, true); //实现图片自动向左移动,到头了重新移动 final Handler handler = new Handler() { public void handleMessage(Message msg) { //判断消息的值是否为1,如果是,则表明是由我的程序发过来的 if (msg.what == 1) { Log.i("TAG", "-----"+startX); //如果到头了,将x坐标直接设置为0.这样的效果有些突兀,大概知道个原理即可 if (startX <= -80) { startX = 0; } else { //如果没到头,就减少个坐标 startX -= 0.09; } } invalidate();//将坐标更新后,重绘。会调用onDraw()方法 } }; new Timer().schedule(new TimerTask() { @Override public void run() { //发送消息的值为1,handler来判断下这个值,是1就执行。 handler.sendEmptyMessage(1); } //无延迟,10毫秒循环一次。 }, 0 , 10); } @Override public void onDraw(Canvas canvas) { Log.i("TAG", "-----onDraw"); Bitmap bitmap2 = Bitmap.createBitmap(mBitmap); canvas.drawBitmap(mBitmap, (float)startX , 0 , null); } }