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

    }

}

你可能感兴趣的:(imageview)