Android下的Gallery显示技术分析(二)

本文介绍了一种使用Adapter创建具有倒影效果的view序列的方法,并详细解释了如何在Gallery控件中实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前我们分析了一个例子用于实现显示选中效果,这里我们来一个不同的,我们对于每个view都显示一个倒影效果。

本篇文章的主要代码来自于网络上的一个3D的Gallery控件代码,由于作者原文找不到所以没有给出对应链接,也希望了解的朋友们能够告知,感谢网络中这些无私奉献的朋友们。


闲话少说,我们先看代码:

public class ImageAdapter extends BaseAdapter {
	// 倒影图和原图之间的距离
	private static final int REFLECTION_GAP = 20;
	// 默认画笔
	private static final Paint DEFAULT_PAINT = new Paint();
	
	private Context context;
	private Integer[] imageResources;
	private ImageView[] imageViews;

	public ImageAdapter(Context context, Integer[] imageResources) {
		this.context = context;
		this.imageResources = imageResources;
		imageViews = new ImageView[imageResources.length];
		createReflectedImages();
	}

	/**
	 * 创建倒影效果
	 * @return
	 */
	private boolean createReflectedImages() {
		for (int i = 0; i < imageResources.length; i++) {
			// 原图解码之后的bitmap对象
			Bitmap originalImage = BitmapFactory.decodeResource(context
					.getResources(), imageResources[i]);
			imageViews[i] = createReflectView(originalImage);
		}
		return true;
	}

	/**
	 * 创建反射后的视图
	 * @param originalImage,转换前的原图片
	 * @param v,转换后的ImageView
	 */
	private ImageView createReflectView(Bitmap originalImage) {
		int width = originalImage.getWidth();
		int height = originalImage.getHeight();

		Bitmap reflectionImage = createReflectImage(originalImage, width,
				height);
		// 创建一个宽度不变,高度为原图+倒影图高度的位图
		int viewWidth = width;
		int viewHeight = height + REFLECTION_GAP + height / 2;
		Bitmap bitmapWithReflect = Bitmap.createBitmap(viewWidth, viewHeight , Config.ARGB_8888);
		// 将上面创建的位图初始化到画布
		Canvas canvas = new Canvas(bitmapWithReflect);
		// 将原始位图画上去
		canvas.drawBitmap(originalImage, 0, 0, null);
		// 绘制原图与倒影图中间的分隔部分
		canvas.drawRect(0, height, width, height + REFLECTION_GAP, DEFAULT_PAINT);
		// 绘制倒影
		canvas.drawBitmap(reflectionImage, 0, height + REFLECTION_GAP, null);

		 /**  
		   * 参数一:为渐变起初点坐标x位置,  
		   * 参数二:为y轴位置,  
		   * 参数三和四:分辨对应渐变终点,  
		   * 最后参数为平铺方式,  
		   * 这里设置为镜像Gradient是基于Shader类,所以我们通过Paint的setShader方法来设置这个渐变  
		   */  
		Paint paint = new Paint();
		LinearGradient shader = new LinearGradient(0, originalImage
				.getHeight(), 0, bitmapWithReflect.getHeight(), 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
		// 设置阴影
		paint.setShader(shader);
		paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
		// 用已经定义好的画笔构建一个矩形阴影渐变效果
		canvas.drawRect(0, height, width, bitmapWithReflect.getHeight(), paint);
		
		// 创建一个ImageView用来显示已经画好的bitmapWithReflection
		ImageView imageView = new ImageView(context);
		imageView.setImageBitmap(bitmapWithReflect);
		// 设置imageView大小 ,也就是最终显示的图片大小
		imageView.setLayoutParams(new Gallery3D.LayoutParams(viewWidth, viewHeight));
//			imageView.setScaleType(ScaleType.MATRIX);
		return imageView;
	}

	/**
	 * 创建反射后的位图
	 * @param originalImage
	 * @param width
	 * @param height
	 * @return
	 */
	private Bitmap createReflectImage(Bitmap originalImage, int width,
			int height) {
		// 创建矩阵对象
		Matrix matrix = new Matrix();
		// 指定矩阵(x轴不变,y轴相反)
		matrix.preScale(1, -1);
		// 将矩阵应用到该原图之中,返回一个宽度不变,高度为原图1/2的倒影位图
		Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
				height / 2, width, height / 2, matrix, false);
		return reflectionImage;
	}

	public int getCount() {
		return imageResources.length;
	}

	public Object getItem(int position) {
		return position;
	}

	public long getItemId(int position) {
		return position;
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		return imageViews[position];
	}

	public float getScale(boolean focused, int offset) {
		return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));
	}

}

这次的代码有些复杂,但主要的思想未变,仍然是在Adapter创建的时候将传入的图片转换为一个完整的倒影view序列,之后在需要的时候取出显示即可。


注意倒影是先计算出尺寸,然后画上原图+水面区域+倒影的,具体参数在代码中都是可调节的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值