自动移动的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);
    }
}
复制代码
posted @   developer_Kale  阅读(1848)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
网站流量统计工具
点击右上角即可分享
微信分享提示