一、图片的放大与缩小
1.图片实现缩放的Activcity
package com.ruidde.csndresourcedemo.enlargenarrow;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import androidx.viewpager.widget.ViewPager;
import com.ruidde.csndresourcedemo.R;
public class FindDetailPhotoActivity extends Activity implements ViewPager.OnPageChangeListener {
private ViewPager viewpager_individualphoto;
private TextView tv_content;
private int[] imgDate = new int[]{};
private FindDetailPhotoAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.find_detailphoto);
findViewById();
initViewDate();
setInitView();
}
public void setInitView(){
adapter = new FindDetailPhotoAdapter(this, imgDate);
// adapter = new FindDetailPhotoAdapter(this);
viewpager_individualphoto.setAdapter(adapter);
viewpager_individualphoto.setOnPageChangeListener(this);
}
public void initViewDate(){
Intent intent = getIntent();
Bundle bundle = new Bundle();
bundle = intent.getExtras();
imgDate = bundle.getIntArray("imgDate");
tv_content.setText(1 + "/" + imgDate.length);
}
public void findViewById(){
tv_content = (TextView) findViewById(R.id.tv_content);
viewpager_individualphoto = (ViewPager) findViewById(R.id.viewpager_individualphoto);
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int position) {
tv_content.setText((position+1)+"/" + imgDate.length);
}
}
package com.ruidde.csndresourcedemo.enlargenarrow;
import java.util.List;
import uk.co.senab.photoview.PhotoView;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import androidx.viewpager.widget.PagerAdapter;
public class FindDetailPhotoAdapter extends PagerAdapter {
private int[] urls = new int[]{};
private Context context;
public FindDetailPhotoAdapter(Context context,int[] urls) {
super();
this.urls = urls;
this.context = context;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return urls == null ? 0 : urls.length;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// container.addView(views.get(position), 0);
// return views.get(position);
PhotoView photoView = new PhotoView(container.getContext());
// String url = Config.PATH + urls.get(position);
// AWonderBitmap aWonderBitmap=AWonderBitmap.create(container.getContext());
// aWonderBitmap.display(photoView, url, BitmapFactory.decodeResource(context.getResources(), R.drawable.touxiang_img),
// BitmapFactory.decodeResource(context.getResources(), R.drawable.touxiang_img));
container.addView(photoView, LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
photoView.setImageResource(urls[position]);
return photoView;
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
super.setPrimaryItem(container, position, object);
}
}
package com.ruidde.csndresourcedemo.enlargenarrow;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import com.ruidde.csndresourcedemo.R;
public class ImageViewAdapter extends BaseAdapter {
private Context context;
private int[] imgDate = new int[]{};
public ImageViewAdapter(Context context,int[] imgDate){
this.context = context;
this.imgDate = imgDate;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return imgDate.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return imgDate[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(context).inflate(R.layout.img_adapter, null);
ImageView imgView = (ImageView) convertView.findViewById(R.id.imgview);
imgView.setImageResource(imgDate[position]);
return convertView;
}
}
主Activity
package com.ruidde.csndresourcedemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import com.ruidde.csndresourcedemo.enlargenarrow.FindDetailPhotoActivity;
import com.ruidde.csndresourcedemo.enlargenarrow.ImageViewAdapter;
/**
* 图片的放大与缩小
* */
public class EnlargeNarrowActivity extends Activity {
private int[] imgResource = new int[]{R.mipmap.one ,R.mipmap.two ,R.mipmap.three ,R.mipmap.four ,R.mipmap.five ,R.mipmap.six ,
R.mipmap.seven ,R.mipmap.eight ,R.mipmap.nine};
private GridView img_gridView;
private ImageViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_photo_view_demo);
img_gridView =findViewById(R.id.img_gridView);
adapter = new ImageViewAdapter(this, imgResource);
img_gridView.setAdapter(adapter);
img_gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(getApplicationContext(), FindDetailPhotoActivity.class);
Bundle bundle = new Bundle();
bundle.putIntArray("imgDate", imgResource);
intent.putExtras(bundle);
startActivity(intent);
}
});
}
}
放大缩小的类
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<GridView
android:id="@+id/img_gridView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numColumns="2"
android:scrollbars="none"
android:verticalSpacing="16dip" />
</LinearLayout>
二、使用Glide来实现图片的圆角、圆形、高斯模糊等功能。
1.在build中引入
//图片加载 可实现圆角
implementation 'com.github.bumptech.glide:glide:4.10.0'
//Glide高斯模糊
implementation 'jp.wasabeef:glide-transformations:4.1.0'
//Glide圆角
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'
2.创建xml : activity_circleimage
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/imgView"
android:layout_width="wrap_content"
android:layout_height="200dp"
android:scaleType="fitXY"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:src="@mipmap/one"/>
<ImageView
android:id="@+id/imgViewCir"
android:layout_width="200dp"
android:layout_height="200dp"
android:scaleType="fitXY"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:src="@mipmap/three"/>
<ImageView
android:id="@+id/imgViewRound"
android:layout_width="200dp"
android:layout_height="200dp"
android:scaleType="fitXY"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"
android:src="@mipmap/two"/>
</LinearLayout>
3.实现图圆角的类 :GlideRoundTransform
package com.ruidde.csndresourcedemo.glide;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import androidx.annotation.NonNull;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import java.security.MessageDigest;
/**
* 圆角图
*/
public class GlideRoundTransform extends BitmapTransformation {
private static float radius = 0f;
public GlideRoundTransform(Context context) {
this(context, 4);
}
public GlideRoundTransform(Context context, int dp) {
radius = Resources.getSystem().getDisplayMetrics().density * dp;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return roundCrop(pool, toTransform);
}
private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
return result;
}
public String getId() {
return getClass().getName() + Math.round(radius);
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
}
}
4.Activity中使用方法
package com.ruidde.csndresourcedemo;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
import com.bumptech.glide.request.RequestOptions;
import com.ruidde.csndresourcedemo.glide.GlideRoundTransform;
import jp.wasabeef.glide.transformations.BlurTransformation;
import static com.bumptech.glide.request.RequestOptions.bitmapTransform;
/**
* 在build中添加引用
* //图片加载 可实现圆角
* implementation 'com.github.bumptech.glide:glide:4.10.0'
* //高斯模糊
* implementation 'jp.wasabeef:glide-transformations:4.1.0'
* 实现图片圆角与高斯模糊处理
*/
public class CircleImageActivity extends Activity {
private Context context;
private ImageView imgView, imgViewCir, imgViewRound;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_circleimage);
context = this;
imgView = findViewById(R.id.imgView);
imgViewCir = findViewById(R.id.imgViewCir);
imgViewRound = findViewById(R.id.imgViewRound);
//实现高斯模糊
Glide.with(this).load(R.mipmap.one)
.apply(bitmapTransform(new BlurTransformation(50)))
.into(imgView); //模糊效果
Glide.with(this).load(R.mipmap.three)
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
.into(imgViewCir);//圆行
Glide.with(this).load(R.mipmap.two)
.transform(new GlideRoundTransform(context, 10)) //图片圆角弧度
.error(R.mipmap.ic_launcher)
.placeholder(R.mipmap.ic_launcher)
.into(imgViewRound);
}
}
三、图片3D倒影显示
1.图片3D倒影显示的主要工具类 :GalleryFlow
package com.ruidde.csndresourcedemo.daoying;
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;
import android.widget.ImageView;
public class GalleryFlow extends Gallery {
private Camera mCamera = new Camera();
/**
* 图片间旋转的角度
*/
private int mMaxRotationAngle = 60;
private int mMaxZoom = -120;
private int mCoveflowCenter;
public GalleryFlow(Context context) {
super(context);
this.setStaticTransformationsEnabled(true);
}
public GalleryFlow(Context context, AttributeSet attrs) {
super(context, attrs);
this.setStaticTransformationsEnabled(true);
}
public GalleryFlow(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.setStaticTransformationsEnabled(true);
}
public int getMaxRotationAngle() {
return mMaxRotationAngle;
}
public void setMaxRotationAngle(int maxRotationAngle) {
mMaxRotationAngle = maxRotationAngle;
}
public int getMaxZoom() {
return mMaxZoom;
}
public void setMaxZoom(int maxZoom) {
mMaxZoom = maxZoom;
}
private int getCenterOfCoverflow() {
return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2
+ getPaddingLeft();
}
private static int getCenterOfView(View view) {
return view.getLeft() + view.getWidth() / 2;
}
protected boolean getChildStaticTransformation(View child, Transformation t) {
final int childCenter = getCenterOfView(child);
final int childWidth = child.getWidth();
int rotationAngle = 0;
t.clear();
t.setTransformationType(Transformation.TYPE_MATRIX);
if (childCenter == mCoveflowCenter) {
transformImageBitmap((ImageView) child, t, 0);
} else {
rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);
if (Math.abs(rotationAngle) > mMaxRotationAngle) {
rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle
: mMaxRotationAngle;
}
transformImageBitmap((ImageView) child, t, rotationAngle);
}
return true;
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mCoveflowCenter = getCenterOfCoverflow();
super.onSizeChanged(w, h, oldw, oldh);
}
private void transformImageBitmap(ImageView child, Transformation t,
int rotationAngle) {
mCamera.save();
final Matrix imageMatrix = t.getMatrix();
final int imageHeight = child.getLayoutParams().height;
final int imageWidth = child.getLayoutParams().width;
final int rotation = Math.abs(rotationAngle);
/**
* 在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. 图片显示的适配器
package com.ruidde.csndresourcedemo.daoying;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader.TileMode;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private Integer[] mImageIds;
private ImageView[] mImages;
public ImageAdapter(Context c, Integer[] ImageIds) {
mContext = c;
mImageIds = ImageIds;
mImages = new ImageView[mImageIds.length];
}
@SuppressWarnings("deprecation")
public boolean createReflectedImages() { //修改图片动画旋转的角度与倒影的设置
final int reflectionGap = 4;
int index = 0;
for (int imageId : mImageIds) {
Bitmap originalImage = BitmapFactory.decodeResource(mContext.getResources(), imageId);
int width = originalImage.getWidth();
int height = originalImage.getHeight();
// 创建一个源图一样的图,利用martrix将图片旋转180度。这个倒影图的高是源图的一半。
Matrix matrix = new Matrix();
// 1表示放大比例,不放大也不缩小。
// -1表示在y轴上相反,即旋转180度。
matrix.preScale(1, -1);
Bitmap reflectionImage = Bitmap.createBitmap(originalImage,
0,
height / 2, // top为源图的一半
width, // 宽度与源图一样
height / 2, // 高度与源图的一半
matrix,
false);
// 创建一个最终效果的图,即源图 + 间隙 + 倒影。
Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 2), Config.ARGB_8888);
// 依次将源图、倒影图绘制在最终的bitmap上面。
Canvas canvas = new Canvas(bitmapWithReflection);
canvas.drawBitmap(originalImage, 0, 0, null);
Paint deafaultPaint = new Paint();
canvas.drawRect(0, height, width, height + reflectionGap, deafaultPaint);
canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
// 创建LinearGradient,从而给定一个由上到下的渐变色。
Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
+ reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);
//图片的显示
ImageView imageView = new ImageView(mContext);
imageView.setImageBitmap(bitmapWithReflection);
imageView.setLayoutParams(new GalleryFlow.LayoutParams(500, 800)); //修改显示图片的大小
imageView.setScaleType(ScaleType.FIT_XY);
mImages[index++] = imageView;
}
return true;
}
private Resources getResources() {
// TODO Auto-generated method stub
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中使用
package com.ruidde.csndresourcedemo;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.ruidde.csndresourcedemo.daoying.GalleryFlow;
import com.ruidde.csndresourcedemo.daoying.ImageAdapter;
/**
* 图片3D倒影显示
*/
public class Image3DDaoYingActivity extends Activity {
private Context context;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_3d_daoying);
context = this;
Integer[] images= new Integer[]{R.mipmap.one ,R.mipmap.two ,R.mipmap.three ,R.mipmap.four ,R.mipmap.five ,R.mipmap.six ,
R.mipmap.seven ,R.mipmap.eight ,R.mipmap.nine};
ImageAdapter adapter = new ImageAdapter(this, images);
adapter.createReflectedImages();
GalleryFlow galleryFlow =findViewById(R.id.galleryFlow);
galleryFlow.setAdapter(adapter);
}
}
4.XML文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.ruidde.csndresourcedemo.daoying.GalleryFlow
android:id="@+id/galleryFlow"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
注:如果想查看具体的可以点击下面链接下载源码:https://download.csdn.net/download/yyxhzdm/12850805
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/119214.html