首页 > 代码库 > 自动移动的ImageView

自动移动的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);    }}