Android Gallery控件使用方法详解(1)

// 在Z轴上正向移动camera的视角,实际效果为放大图片。

// 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。

mCamera.translate(0.0f, 0.0f, 100.0f);

// As the angle of the view gets less, zoom in

if (rotation < mMaxRotationAngle) {

float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));

mCamera.translate(0.0f, 0.0f, zoomAmount);

}

// 在Y轴上旋转,对应图片竖向向里翻转。

// 如果在X轴上旋转,则对应图片横向向里翻转。

mCamera.rotateY(rotationAngle);

mCamera.getMatrix(imageMatrix);

imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));

imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));

mCamera.restore();

}

}

2.填充图片容器(BaseAdapter):

public class ImageAdapter extends BaseAdapter {

int mGalleryItemBackground;

private Context mContext;

private Integer[] mImageIds;

private ImageView[] mImages;

public ImageAdapter(Context c, Integer[] ImageIds) {

mContext = c;

mImageIds = ImageIds;

mImages = new ImageView[mImageIds.length];

}

/**

* 创建倒影效果

* @return

*/

public boolean createReflectedImages() {

//倒影图和原图之间的距离

final int reflectionGap = 4;

int index = 0;

for (int imageId : mImageIds) {

//返回原图解码之后的bitmap对象

Bitmap originalImage = BitmapFactory.decodeResource(mContext.getResources(), imageId);

int width = originalImage.getWidth();

int height = originalImage.getHeight();

//创建矩阵对象

Matrix matrix = new Matrix();

//指定一个角度以0,0为坐标进行旋转

// matrix.setRotate(30);

//指定矩阵(x轴不变,y轴相反)

matrix.preScale(1, -1);

//将矩阵应用到该原图之中,返回一个宽度不变,高度为原图1/2的倒影位图

Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,

height/2, width, height/2, matrix, false);

//创建一个宽度不变,高度为原图+倒影图高度的位图

Bitmap bitmapWithReflection = Bitmap.createBitmap(width,

(height + height / 2), Config.ARGB_8888);

//将上面创建的位图初始化到画布

Canvas canvas = new Canvas(bitmapWithReflection);

canvas.drawBitmap(originalImage, 0, 0, null);

Paint deafaultPaint = new Paint();

deafaultPaint.setAntiAlias(false);

// canvas.drawRect(0, height, width, height + reflectionGap,deafaultPaint);

canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);

Paint paint = new Paint();

paint.setAntiAlias(false);

/**

* 参数一:为渐变起初点坐标x位置,

* 参数二:为y轴位置,

* 参数三和四:分辨对应渐变终点,

* 最后参数为平铺方式,

* 这里设置为镜像Gradient是基于Shader类,所以我们通过Paint的setShader方法来设置这个渐变

*/

LinearGradient shader = new LinearGradient(0,originalImage.getHeight(), 0,

bitmapWithReflection.getHeight() + reflectionGap,0x70ffffff, 0x00ffffff, TileMode.MIRROR);

//设置阴影

paint.setShader(shader);

paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.DST_IN));

//用已经定义好的画笔构建一个矩形阴影渐变效果

canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()+ reflectionGap, paint);

//创建一个ImageView用来显示已经画好的bitmapWithReflection

ImageView imageView = new ImageView(mContext);

imageView.setImageBitmap(bitmapWithReflection);

//设置imageView大小 ,也就是最终显示的图片大小

imageView.setLayoutParams(new GalleryFlow.LayoutParams(300, 400));

//imageView.setScaleType(ScaleType.MATRIX);

mImages[index++] = imageView;

}

return true;

}

@SuppressWarnings(“unused”)

private Resources getResources() {

return null;

}

public int getCount() {

return mImageIds.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 mImages[position];

}

public float getScale(boolean focused, int offset) {

return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));

}

}

3.创建Activity:

public class Gallery3DActivity extends Activity {

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.layout_gallery);

Integer[] images = { R.drawable.img0001, R.drawable.img0030,

R.drawable.img0100, R.drawable.img0130, R.drawable.img0200,

R.drawable.img0230, R.drawable.img0330,R.drawable.img0354 };

ImageAdapter adapter = new ImageAdapter(this, images);

adapter.createReflectedImages();//创建倒影效果

GalleryFlow galleryFlow = (GalleryFlow) this.findViewById(R.id.Gallery01);

galleryFlow.setFadingEdgeLength(0);

galleryFlow.setSpacing(-100); //图片之间的间距

galleryFlow.setAdapter(adapter);

galleryFlow.setOnItemClickListener(new OnItemClickListener() {

总结

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2021最新面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。

2020面试真题解析
腾讯面试真题解析

阿里巴巴面试真题解析

字节跳动面试真题解析
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ndroid的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值