热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现图片反转、翻转、旋转、放大和缩小

这篇文章主要介绍了Android实现图片反转、翻转、旋转、放大和缩小的相关代码,需要的朋友可以参考下

**********************************************************************

android 实现图片的翻转

**********************************************************************

Resources res = this.getContext().getResources();
 img = BitmapFactory.decodeResource(res, R.drawable.aa);
 Matrix matrix = new Matrix();
 matrix.postRotate(180); /*翻转180度*/
 int width = img.getWidth();
 int height = img.getHeight();
 img_a = Bitmap.createBitmap(img, 0, 0, width, height, matrix, true);

然后可以直接把img_a draw到画布上,canvas.drawBitmap(img_a, 10, 10, p);

Matrix 是一个处理翻转、缩放等图像效果的重要类,Matrix.postScale 可设置缩放比例,默认为1

**********************************************************************
android 实现图片的旋转

**********************************************************************

public class ex04_22 extends Activity{
 
private ImageView mImageView;
private Button btn1,btn2;
private TextView mTextView;
private AbsoluteLayout layout1;
private int ScaleTimes=1,ScaleAngle=1;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 mImageView=(ImageView)findViewById(R.id.myImageView);
 final Bitmap bmp=BitmapFactory.decodeResource(this.getResources(),R.drawable.ex04_22_1);
 final int widthOrig=bmp.getWidth();
 final int heightOrig=bmp.getHeight();
 mImageView.setImageBitmap(bmp);
 btn1=(Button)findViewById(R.id.myButton1);
 btn1.setOnClickListener(new OnClickListener(){
 public void onClick(View v){
 ScaleAngle--;
 if(ScaleAngle<-60){
 ScaleAngle=-60;
 }
 int newWidth=widthOrig*ScaleTimes;
 int newHeight=heightOrig*ScaleTimes;
 float scaleWidth=((float)newWidth)/widthOrig;
 float scaleHeight=((float)newHeight)/heightOrig;
 Matrix matrix=new Matrix();
 matrix.postScale(scaleWidth, scaleHeight);
 matrix.setRotate(5*ScaleAngle);
 Bitmap resizeBitmap=Bitmap.createBitmap(bmp, 0, 0, widthOrig, heightOrig, matrix, true);
 BitmapDrawable myNewBitmapDrawable=new BitmapDrawable(resizeBitmap);
 mImageView.setImageDrawable(myNewBitmapDrawable);
 }
 });
 btn2=(Button)findViewById(R.id.myButton2);
 btn2.setOnClickListener(new OnClickListener(){
 public void onClick(View v){
 ScaleAngle++;
 if(ScaleAngle>60){
 ScaleAngle=60;
 }
 int newWidth=widthOrig*ScaleTimes;
 int newHeight=heightOrig*ScaleTimes;
 float scaleWidth=((float)newWidth)/widthOrig;
 float scaleHeight=((float)newHeight)/heightOrig;
 Matrix matrix=new Matrix();
 matrix.postScale(scaleWidth, scaleHeight);
 matrix.setRotate(5*ScaleAngle);
 Bitmap resizeBitmap=Bitmap.createBitmap(bmp, 0, 0, widthOrig, heightOrig, matrix, true);
 BitmapDrawable myNewBitmapDrawable=new BitmapDrawable(resizeBitmap);
 mImageView.setImageDrawable(myNewBitmapDrawable);
 }
 });
 }

**********************************************************************

实现画面淡入淡出效果可以用 :setAlpha(alpha);
alpha从255,逐渐递减!

**********************************************************************

如何实现屏幕的滚动效果,这里有两个关键点,一个是实现OnGestureListener,以便在触摸事件发生的时候,被回调。包括按下,滚动等等,按照API文档,需要分两步来实现检测手势行为。

1)创建GestureDetector实例

2) 在onTouchEvent()方法中调用GestureDetector的onTouchEvent()方法。

另一个关键点是自己实现一个简单的View,来绘制图片。

代码如下所示。由于,我们不需要使用layout定义,所以不需要提供xml文件。
直接在程序里面setContentView()即可。

package com.j2medev;
 
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.GestureDetector.OnGestureListener;
 
public class HorizontalScroll extends Activity implements OnGestureListener {
private static final int X_MAX = 800;
private static final int Y_MAX = 600;
private int scrollX = 0;
private int scrollY = 0;
 
MyView main;
Bitmap bmp;
Bitmap adapt;
Resources res;
Paint paint;
GestureDetector gestureScanner;
 
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 
gestureScanner = new GestureDetector(this);
paint = new Paint();
 
res = getResources();
bmp = BitmapFactory.decodeResource(res, R.drawable.arc);
adapt = Bitmap.createBitmap(bmp);
 
main = new MyView(this);
setContentView(main, new ViewGroup.LayoutParams(800, 600));
}
 
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureScanner.onTouchEvent(me);
}
 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
 float distanceY) {
main.handleScroll(distanceX, distanceY);
return true;
}
 
public boolean onDown(MotionEvent e) {
return true;
}
 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
 float velocityY) {
return true;
}
 
public void onLongPress(MotionEvent e) {
}
 
public void onShowPress(MotionEvent e) {
}
 
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
 
// //////////////////
// /////////////////
// ////////////////
 
class MyView extends View {
public MyView(Context context) {
 super(context);
}
 
@Override
protected void onDraw(Canvas canvas) {
 canvas.drawBitmap(adapt, -scrollX, -scrollY, paint);
}
 
public void handleScroll(float distX, float distY) {
 // X-Axis ////////////////////////////////
 
 if (distX > 6.0) {
 if (scrollX <460) {
 scrollX += 15;
 }
 } else if (distX <-6.0) {
 if (scrollX >= 15) {
 scrollX -= 15;
 }
 }
 // //////////////////////////////////////////
 
 // Y-AXIS //////////////////////////////////
 if (distY > 6.0) {
 if (scrollY <100) {
 scrollY += 15;
 }
 } else if (distY <-6.0) {
 if (scrollY >= 15) {
 scrollY -= 15;
 }
 }
 // //////////////////////////////////////////
 //
 // if ((scrollX <= 480) && (scrollY <= 120)) {
 // adapt = Bitmap.createBitmap(bmp, scrollX, scrollY, 320, 480);
 // invalidate();
 // }
 invalidate();
}
}
}

**********************************************************************

教你在谷歌Android平台中处理图片

**********************************************************************

操作图像像素

现在你可以对单独的像素进行处理了。通过使用android.graphics.Bitmap API中的getPixels,可以加载像素到一个整数数组中。

在本文例子中,你将按照一定规则对每一个像素实现着色。经过这个处理后,所有的像素将被转化为一个范围在0到255的字节码。

android.graphics.Bitmap API中的setPixels则用来加载这个整数数组到一个图像中。

最后一步是通过ImageView变量mIV来更新屏幕。以下是实现这个染色过程的代码片段。

private void TintThePicture(int deg) {
 int[] pix = new int[picw * pich];
 mBitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);
 
 int RY, GY, BY, RYY, GYY, BYY, R, G, B, Y;
 double angle = (3.14159d * (double)deg) / 180.0d;
 int S = (int)(256.0d * Math.sin(angle));
 int C = (int)(256.0d * Math.cos(angle));
 
 for (int y = 0; y > 16) & 0xff;
 int g = (pix[index] >> 8) & 0xff;
 int b = pix[index] & 0xff;
 RY = ( 70 * r - 59 * g - 11 * b) / 100;
 GY = (-30 * r + 41 * g - 11 * b) / 100;
 BY = (-30 * r - 59 * g + 89 * b) / 100;
 Y = ( 30 * r + 59 * g + 11 * b) / 100;
 RYY = (S * BY + C * RY) / 256;
 BYY = (C * BY - S * RY) / 256;
 GYY = (-51 * RYY - 19 * BYY) / 100;
 R = Y + RYY;
 R = (R <0) &#63; 0 : ((R > 255) &#63; 255 : R);
 G = Y + GYY;
 G = (G <0) &#63; 0 : ((G > 255) &#63; 255 : G);
 B = Y + BYY;
 B = (B <0) &#63; 0 : ((B > 255) &#63; 255 : B);
 pix[index] = 0xff000000 | (R <<16) | (G <<8) | B;
 }
 
 Bitmap bm = Bitmap.createBitmap(picw, pich, false);
 bm.setPixels(pix, 0, picw, 0, 0, picw, pich);
 
 // Put the updated bitmap into the main view
 mIV.setImageBitmap(bm);
 mIV.invalidate();
 
 mBitmap = bm;
 pix = null;
 }

**********************************************************************

android 图片的放大和缩小

**********************************************************************

public class ex04_22 extends Activity{
private ImageView mImageView;
private Button btn1,btn2;
private TextView mTextView;
private AbsoluteLayout layout1;
private Bitmap bmp;
private int id=0;
private int displayWidth,displayHeight;
private float scaleWidth=1,scaleHeight=1;
private final static String filename="/data/data/ex04_22.lcs/ex04_22_2.png";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//取得屏幕分辨率
DisplayMetrics dm=new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
displayWidth=dm.widthPixels;
displayHeight=dm.heightPixels-80;
bmp=BitmapFactory.decodeResource(this.getResources(),R.drawable.ex04_22_1);
layout1=(AbsoluteLayout)findViewById(R.id.layout1);
mImageView=(ImageView)findViewById(R.id.myImageView);
btn1=(Button)findViewById(R.id.myButton1);
btn1.setOnClickListener(new OnClickListener(){
public void onClick(View v){
small();
}
});
btn2=(Button)findViewById(R.id.myButton2);
btn2.setOnClickListener(new OnClickListener(){
public void onClick(View v){
big();
}
});
}
private void small(){
//获得Bitmap的高和宽
int bmpWidth=bmp.getWidth();
int bmpHeight=bmp.getHeight();
//设置缩小比例
double scale=0.8;
//计算出这次要缩小的比例
scaleWidth=(float)(scaleWidth*scale);
scaleHeight=(float)(scaleHeight*scale);
//产生resize后的Bitmap对象
Matrix matrix=new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizeBmp=Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix, true);
if(id==0){
layout1.removeView(mImageView);
}
else{
layout1.removeView((ImageView)findViewById(id));
}
id++;
ImageView imageView=new ImageView(this);
imageView.setId(id);
imageView.setImageBitmap(resizeBmp);
layout1.addView(imageView);
setContentView(layout1);
btn2.setEnabled(true);
}
private void big(){
//获得Bitmap的高和宽
int bmpWidth=bmp.getWidth();
int bmpHeight=bmp.getHeight();
//设置缩小比例
double scale=1.25;
//计算出这次要缩小的比例
scaleWidth=(float)(scaleWidth*scale);
scaleHeight=(float)(scaleHeight*scale);
//产生resize后的Bitmap对象
Matrix matrix=new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizeBmp=Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix, true);
if(id==0){
layout1.removeView(mImageView);
}
else{
layout1.removeView((ImageView)findViewById(id));
}
id++;
ImageView imageView=new ImageView(this);
imageView.setId(id);
imageView.setImageBitmap(resizeBmp);
layout1.addView(imageView);
setContentView(layout1);
if(scaleWidth*scale*bmpWidth>displayWidth||scaleHeight*scale*scaleHeight>displayHeight){
btn2.setEnabled(false);
}
}
}

xml文件

<&#63;xml version="1.0" encoding="utf-8"&#63;>
 





*********************************************************************

android 图片透明度处理代码

*********************************************************************

public static Bitmap setAlpha(Bitmap sourceImg, int number) {
 
  int[] argb = new int[sourceImg.getWidth() * sourceImg.getHeight()];
 
  sourceImg.getPixels(argb, 0, sourceImg.getWidth(), 0, 0,sourceImg.getWidth(), sourceImg.getHeight());// 获得图片的ARGB值
 
  number = number * 255 / 100;
 
  for (int i = 0; i 

以上就是涉及到了Android图片处理的所有内容,包括android图片反转、android 图片翻转、android 图片旋转、实现画面淡入淡出效果、android 图片的放大和缩小以及教你在谷歌Android平台中处理图片。


推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了在使用MSXML解析XML文件时出现DTD禁用问题的解决方案。通过代码示例和错误信息获取方法,解释了默认情况下DTD是禁用的,以及如何启用DTD的方法。此外,还提到了网上关于该问题的信息相对较少,因此本文提供了解决方案以供参考。 ... [详细]
author-avatar
mobiledu2502931437
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有