android 3d画廊倒影,Android图片画廊式倒影显示

package cn.gallery;

import android.app.Activity;

import android.content.res.Resources;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.LinearGradient;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.graphics.PorterDuff;

import android.graphics.PorterDuffXfermode;

import android.graphics.Shader;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.Gallery;

import android.widget.ImageView;

//本案例使用自己定义的图片资源来显示,其他功能如:打开画廊时,自动扫描SDCard中的图片资源,再将其显示,或者定义一个按钮,添加一个按钮事件,手动添加自己所需要的图片

public class MainActivity extends Activity {

//资源类

private Resources r;

//定义原图和倒影之间的间隙

int gap = 4 ;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

r = this.getResources();

MyGallery g = (MyGallery) findViewById(R.id.gallery);

MyAdapter a = new MyAdapter();

//画大图

a.createBigBmps();

g.setAdapter(a);

}

/**

* 自定义适配器

*/

class MyAdapter extends BaseAdapter{

int[] resids = {

R.drawable.img0001,

R.drawable.img0030,

R.drawable.img0100,

R.drawable.img0130,

R.drawable.img0200,

R.drawable.img0230,

R.drawable.img0300,

R.drawable.img0330,

R.drawable.img0354

};

ImageView[] ivs ;

public int getCount() {

return resids.length;

}

/**

* 画大图

*/

public void createBigBmps() {

ivs = new ImageView[resids.length];

//遍历所有原图

for(int i = 0 ; i < resids.length ; i ++){

//解码原始图片

Bitmap srcBmp = BitmapFactory.decodeResource(r, resids[i]);

//取得原图的宽度和高度

int srcWidth = srcBmp.getWidth();

int srcHeight = srcBmp.getHeight();

//创建大图

Bitmap bigBmp = Bitmap.createBitmap(srcWidth, srcHeight + (srcHeight/2) + gap, Bitmap.Config.ARGB_8888);

//实例化画板

Canvas canvas = new Canvas(bigBmp);

/********************* 画原始图像*****************************/

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

/********************* 画间隙*****************************/

Paint paint = new Paint();

canvas.drawRect(0, srcHeight, srcWidth, srcHeight + gap, paint);

/********************* 画倒影*****************************/

//先从原图中截取下班部分

Matrix matrix = new Matrix();

//-1:方向相反,大小不变

matrix.setScale(1, -1);

//创建倒影图片

Bitmap shaddowBmp = Bitmap.createBitmap(srcBmp, 0, srcHeight / 2, srcWidth, srcHeight / 2, matrix, false);

//将倒影绘制到大图上去

canvas.drawBitmap(shaddowBmp, 0, srcHeight + gap, null);

/********************* 画倒影*****************************/

paint = new Paint();

//线性着色器(梯度着色).

LinearGradient shader = new LinearGradient(0, srcHeight + gap, 0, srcHeight + gap + (srcHeight/2), 0x70ffffff, 0x00ffffff, Shader.TileMode.CLAMP);

//设置着色器

paint.setShader(shader);

//设置传输模式

PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);

paint.setXfermode(mode);

canvas.drawRect(0, srcHeight + gap, srcWidth, srcHeight + (srcHeight/2) + gap, paint);

//创建ImageView控件,分别设置bigBmp.

ImageView iv = new ImageView(MainActivity.this);

Gallery.LayoutParams params = new Gallery.LayoutParams(180,240);

iv.setLayoutParams(params);

iv.setImageBitmap(bigBmp);

ivs[i] = iv ;

}

}

public Object getItem(int position) {

return null;

}

public long getItemId(int position) {

return position;

}

public View getView(int position, View convertView, ViewGroup parent) {

return ivs[position];

}

}

}

package cn.mygallery;

import android.content.Context;

import android.graphics.Camera;

import android.graphics.Matrix;

import android.util.AttributeSet;

import android.view.View;

import android.view.animation.Transformation;

import android.widget.Gallery;

/**

* 自定义画廊

*/

public class MyGallery extends Gallery {

//画廊x中心点

public int xGalleryCenter ;

//画廊y中心点

public int yGalleryCenter ;

//最大旋转角

int maxAngle = 60 ;

//最大

int maxZoom = -120 ;

public MyGallery(Context context) {

super(context);

//设置允许孩子进行静态变换,使得ViewGroup支持Child静态变换,每次绘制child时,

//会调用getChildStaticTransformation()方法

setStaticTransformationsEnabled(true);

}

public MyGallery(Context context,AttributeSet set) {

super(context,set);

setStaticTransformationsEnabled(true);

}

/**

* 取得孩子控件的静态变换对象

*/

protected boolean getChildStaticTransformation(View child, Transformation t) {

//将变换清除,并设置矩阵变换

t.clear();

t.setTransformationType(Transformation.TYPE_MATRIX);

//得到孩子的宽度

int childWidth = child.getWidth();

//取得child的中心点坐标

int xChildCenter = (child.getWidth() / 2) + child.getLeft();

//判断view是否在画廊中心点上

if((xChildCenter == xGalleryCenter)){

//0:旋转角

transformationImageView(child,t,0);

}

//不在中心点,需要进行旋转

else{

//应该做的旋转角度

int angle = (int)(((float)(xGalleryCenter - xChildCenter) / childWidth) * maxAngle) ;

//取得旋转角绝对值,并计算旋转角

int absAngle = Math.abs(angle);

if(absAngle > maxAngle){

angle = angle > 0 ? maxAngle : -maxAngle ;

}

transformationImageView(child,t,angle);

}

return true;

}

/**

* 变换控件

*/

private void transformationImageView(View child, Transformation t, int angle) {

int childWidth = child.getWidth();

int childHeight = child.getHeight();

//相机

Camera canvas = new Camera();

canvas.save();

canvas.translate(0, 0, 100);

int absAngle = Math.abs(angle);

//放大量

int zoom =0 ;

//

if(absAngle < maxAngle){

zoom = (int)(absAngle * 1.5) + maxZoom ;

//将child进行放大

canvas.translate(0, 0, zoom);

}

//绕y轴旋转

canvas.rotateY(angle);

Matrix matrix = t.getMatrix() ;

canvas.getMatrix(matrix);

//平移预处理

matrix.preTranslate(-(childWidth/2), -(childHeight/2));

//平移后处理

matrix.postTranslate((childWidth/2), (childHeight/2));

canvas.restore();

}

/**   *   */  protected void onSizeChanged(int w, int h, int oldw, int oldh) {   super.onSizeChanged(w, h, oldw, oldh);   this.xGalleryCenter = ((w - this.getPaddingLeft() - this.getPaddingRight()) / 2 ) + this.getPaddingLeft() ;   this.yGalleryCenter = ((h - this.getPaddingTop() - this.getPaddingBottom()) / 2 ) + this.getPaddingTop() ;  } }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值