zoukankan      html  css  js  c++  java
  • 自动移动的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);
        }
    }
  • 相关阅读:
    Java 多线程(四) 多线程访问成员变量与局部变量
    再一贴[亲爱的,我不小心怀孕了~!]
    寒铁沉香木出处
    时间格式
    测试
    有关裁缝的
    转贴
    各种贝壳产地
    捕捞资料
    矿木资料
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/3855899.html
Copyright © 2011-2022 走看看