自动移动的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);
    }
}
原文地址:https://www.cnblogs.com/tianzhijiexian/p/3855899.html