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() ;
 }
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值