因为一个Android项目的缘故要在软件打开界面轮流显示两张照片,不想让两张图片替换的太生硬,所以让其中一张图片渐隐,逐渐显示第二张图片。
方法有三种,
第一种:
将渐隐的图片做好几张,透明度从255----0.这样轮流显示不同透明度的图片,出现渐隐效果。但是,这种方法浪费资源,舍弃。(在view中绘画)
第二种:
只用一张图片,将图片的每一点的像素信息保存到数组中,每一点像素是ARGB的方式,正好32位,放到一个int类型的值中。然后改变int值的高八位的大小,实现对alpha值的改变。在将改变的数组信息创造一张新的图片就可以了。
本文重点介绍这一种方法。(在view中绘画)
第三种:
前两种都是在view中实现,也可以再布局中实现,用imageswitcher和进出动画来实现,这个方法在下一篇中介绍。
要实现的效果:
第一张图片显示1秒后,逐渐隐藏,第二张图片出现。
效果很简单就不贴图了。总共两个文件,一个activity一个view。
代码呈上:
Activity:
package liu.com.kiexun;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class SimpleTestActivity extends Activity {
/** Called when the activity is first created. */
SimpleFlash simpleFlash;
boolean flag=true;
private Handler handler=new Handler()
{
public void handleMessage(Message msg)
{
switch(msg.what)
{
case 1:
if (flag)
{
try
{
Thread.sleep(1000);//第一张图片时间显示为1秒
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
flag=false;
}
simpleFlash.invalidate();
break;
default:
break;
}
};
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在这里才产生contex,才可以对view进行初始化
simpleFlash=new SimpleFlash(this,handler);
setContentView(simpleFlash);
}
}
view:
package liu.com.kiexun;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.View;
public class SimpleFlash extends View
{
int index=0;
int size=480*800;
Bitmap firstBitmap,secondBitmap;
Canvas canvas=null;
int pixels[]=new int[size];
Handler handler ;
int changeArrary[]=
{
(1<<31)-1,
(1<<30)-1,
(1<<29)-1,
(1<<28)-1,
(1<<27)-1,
(1<<26)-1,
(1<<25)-1,
(1<<24)-1
};
int changeArrary2[]={
/* 11111110
11111100
11111000
11110000
11100000
11000000
10000000
01111111
00111111
00011111
00001111
00000111
00000011
00000001
00000000
1<<32 相当于没有进行移位 >=32位的时候与移的为数是与32的余数
*/
( ( (1<<31)-1 )+(1<<31)-(1<<24) ),
( ( (1<<31)-1 )+(1<<31)-(1<<24)-(1<<25) ),
( ( (1<<31)-1 )+(1<<31)-(1<<24)-(1<<25)-(1<<26) ),
( ( (1<<31)-1 )+(1<<31)- (1<<24)-(1<<25)-(1<<26)-(1<<27)),
( ( (1<<24)-1 )+(1<<31)+(1<<30)+(1<<29)),
( ( (1<<24)-1 )+(1<<31)+(1<<30)),
( ( (1<<24)-1 )+(1<<31)),
(1<<31)-1,
(1<<30)-1,
(1<<29)-1,
(1<<28)-1,
(1<<27)-1,
(1<<26)-1,
(1<<25)-1,
(1<<24)-1
};
public SimpleFlash(Context context,Handler handler)
{
super(context);
this.handler=handler;
// TODO Auto-generated constructor stub
firstBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.about);
secondBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.help);
firstBitmap.getPixels(pixels, 0, 480, 0, 0, 480, 800);
}
/*
* (non-Javadoc)
* @see android.view.View#onDraw(android.graphics.Canvas)
* draw函数执行完毕才能显示出图片,应该是执行完毕后才能提交绘画消息
*/
public void onDraw(Canvas canvas)
{
this.canvas=canvas;
canvas.drawBitmap(secondBitmap, 0, 0, null);
/*
* 不会先显示第二个图片,5秒后在显示第一个图片
*/
firstBitmap=Bitmap.createBitmap(pixels, 480, 800,Config.ARGB_8888);
canvas.drawBitmap(firstBitmap, 0, 0, null);
changePixels();
try
{
Thread.sleep(100);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void changePixels()
{
if (index<8)
{
for (int i = 1; i < pixels.length; i++)
{
pixels[i]=pixels[i]&changeArrary[index];
}
index++;
Message changeMessage=new Message();
changeMessage.what=1;
handler.sendMessage(changeMessage);
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。