Android實(shí)現(xiàn)圖片反轉(zhuǎn)、翻轉(zhuǎn)、旋轉(zhuǎn)、放大和縮小
**********************************************************************
android 實(shí)現(xiàn)圖片的翻轉(zhuǎn)
**********************************************************************
Resources res = this.getContext().getResources(); img = BitmapFactory.decodeResource(res, R.drawable.aa); Matrix matrix = new Matrix(); matrix.postRotate(180); /*翻轉(zhuǎn)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 是一個(gè)處理翻轉(zhuǎn)、縮放等圖像效果的重要類,Matrix.postScale 可設(shè)置縮放比例,默認(rèn)為1
**********************************************************************
android 實(shí)現(xiàn)圖片的旋轉(zhuǎn)
**********************************************************************
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);
}
});
}
**********************************************************************
實(shí)現(xiàn)畫面淡入淡出效果可以用 :setAlpha(alpha);
alpha從255,逐漸遞減!
**********************************************************************
如何實(shí)現(xiàn)屏幕的滾動(dòng)效果,這里有兩個(gè)關(guān)鍵點(diǎn),一個(gè)是實(shí)現(xiàn)OnGestureListener,以便在觸摸事件發(fā)生的時(shí)候,被回調(diào)。包括按下,滾動(dòng)等等,按照API文檔,需要分兩步來(lái)實(shí)現(xiàn)檢測(cè)手勢(shì)行為。
1)創(chuàng)建GestureDetector實(shí)例
2) 在onTouchEvent()方法中調(diào)用GestureDetector的onTouchEvent()方法。
另一個(gè)關(guān)鍵點(diǎn)是自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的View,來(lái)繪制圖片。
代碼如下所示。由于,我們不需要使用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平臺(tái)中處理圖片
**********************************************************************
操作圖像像素
現(xiàn)在你可以對(duì)單獨(dú)的像素進(jìn)行處理了。通過(guò)使用android.graphics.Bitmap API中的getPixels,可以加載像素到一個(gè)整數(shù)數(shù)組中。
在本文例子中,你將按照一定規(guī)則對(duì)每一個(gè)像素實(shí)現(xiàn)著色。經(jīng)過(guò)這個(gè)處理后,所有的像素將被轉(zhuǎn)化為一個(gè)范圍在0到255的字節(jié)碼。
android.graphics.Bitmap API中的setPixels則用來(lái)加載這個(gè)整數(shù)數(shù)組到一個(gè)圖像中。
最后一步是通過(guò)ImageView變量mIV來(lái)更新屏幕。以下是實(shí)現(xiàn)這個(gè)染色過(guò)程的代碼片段。
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 < pich; y++)
for (int x = 0; x < picw; x++)
{
int index = y * picw + x;
int r = (pix[index] >> 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) ? 0 : ((R > 255) ? 255 : R);
G = Y + GYY;
G = (G < 0) ? 0 : ((G > 255) ? 255 : G);
B = Y + BYY;
B = (B < 0) ? 0 : ((B > 255) ? 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();
//設(shè)置縮小比例
double scale=0.8;
//計(jì)算出這次要縮小的比例
scaleWidth=(float)(scaleWidth*scale);
scaleHeight=(float)(scaleHeight*scale);
//產(chǎn)生resize后的Bitmap對(duì)象
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();
//設(shè)置縮小比例
double scale=1.25;
//計(jì)算出這次要縮小的比例
scaleWidth=(float)(scaleWidth*scale);
scaleHeight=(float)(scaleHeight*scale);
//產(chǎn)生resize后的Bitmap對(duì)象
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文件
<?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout android:id="@+id/layout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" > <ImageView android:id="@+id/myImageView" android:layout_width="200px" android:layout_height="150px" android:src="@drawable/ex04_22_1" android:layout_x="0px" android:layout_y="0px" > </ImageView> <Button android:id="@+id/myButton1" android:layout_width="90px" android:layout_height="60px" android:text="縮小" android:textSize="18sp" android:layout_x="20px" android:layout_y="372px" > </Button> <Button android:id="@+id/myButton2" android:layout_width="90px" android:layout_height="60px" android:text="放大" android:textSize="18sp" android:layout_x="210px" android:layout_y="372px" > </Button> </AbsoluteLayout>
*********************************************************************
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 < argb.length; i++) {
argb = (number << 24) | (argb & 0x00FFFFFF);// 修改最高2位的值
}
sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg.getHeight(), Config.ARGB_8888);
return sourceImg;
}
以上就是涉及到了Android圖片處理的所有內(nèi)容,包括android圖片反轉(zhuǎn)、android 圖片翻轉(zhuǎn)、android 圖片旋轉(zhuǎn)、實(shí)現(xiàn)畫面淡入淡出效果、android 圖片的放大和縮小以及教你在谷歌Android平臺(tái)中處理圖片。
- Android實(shí)現(xiàn)屏幕旋轉(zhuǎn)方法總結(jié)
- Android中利用matrix 控制圖片的旋轉(zhuǎn)、縮放、移動(dòng)
- Android Tween動(dòng)畫之RotateAnimation實(shí)現(xiàn)圖片不停旋轉(zhuǎn)效果實(shí)例介紹
- Android開發(fā) 旋轉(zhuǎn)屏幕導(dǎo)致Activity重建解決方法
- Android編程中調(diào)用Camera時(shí)預(yù)覽畫面有旋轉(zhuǎn)問(wèn)題的解決方法
- Android開發(fā)之圖形圖像與動(dòng)畫(二)Animation實(shí)現(xiàn)圖像的漸變/縮放/位移/旋轉(zhuǎn)
- Android 圖片縮放與旋轉(zhuǎn)的實(shí)現(xiàn)詳解
- Android編程實(shí)現(xiàn)RotateAnimation設(shè)置中心點(diǎn)旋轉(zhuǎn)動(dòng)畫效果
- Android部分手機(jī)拍照后獲取的圖片被旋轉(zhuǎn)問(wèn)題的解決方法
- android實(shí)現(xiàn)icon動(dòng)態(tài)旋轉(zhuǎn)效果
相關(guān)文章
詳解Android中ViewPager的PagerTabStrip子控件的用法
這篇文章主要介紹了Android中ViewPager的PagerTabStrip子控件的用法,PagerTabStrip與PagerTitleStrip的用法基本相同,文中舉了兩個(gè)詳細(xì)的例子,需要的朋友可以參考下2016-03-03
Android使用Pull解析器解析xml文件的實(shí)現(xiàn)代碼
Android使用Pull解析器解析xml文件的實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-02-02
Fragment跳轉(zhuǎn)時(shí)傳遞參數(shù)及結(jié)果回傳的方法(推薦)
今天總結(jié)一下Fragment間的參數(shù)傳遞及結(jié)果返回的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01
Android Studio 新手入門教程(一)基本設(shè)置圖解
這篇文章主要介紹了Android Studio 新手入門教程(一)基本設(shè)置圖解,需要的朋友可以參考下2017-12-12
點(diǎn)九圖片的顯示內(nèi)容區(qū)域應(yīng)作何理解
.9 ,是andriod平臺(tái)的應(yīng)用軟件開發(fā)里的一種特殊的圖片形式,文件擴(kuò)展名為:.9.png;點(diǎn)九圖片的拉伸區(qū)域不難理解,顯示內(nèi)容區(qū)域是怎樣的,接下來(lái)本文為您一一解答,感興趣的朋友可以了解下2013-01-01
Android開發(fā)之DatePicker和TimePicker實(shí)現(xiàn)選擇日期時(shí)間功能示例
這篇文章主要介紹了Android開發(fā)之DatePicker和TimePicker實(shí)現(xiàn)選擇日期時(shí)間功能,結(jié)合實(shí)例形式分析了Android DatePicker和TimePicker組件的功能、常用函數(shù)、布局及日期時(shí)間選擇相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
Android 使用Fragment模仿微信界面的實(shí)例代碼
自從Android 3.0中引入fragments 的概念,根據(jù)詞海的翻譯可以譯為:碎片、片段。其目的是為了解決不同屏幕分辯率的動(dòng)態(tài)和靈活UI設(shè)計(jì)。下面通過(guò)本文給大家分享Android 使用Fragment模仿微信界面的實(shí)例代碼,需要的的朋友參考下吧2017-07-07
Android中Glide加載庫(kù)的圖片緩存配置究極指南
這篇文章主要介紹了Android中Glide加載庫(kù)的圖片緩存配置究極指南,Glide是一款高人氣的安卓多媒體資源加載庫(kù),本文對(duì)其緩存設(shè)置和優(yōu)化作了詳細(xì)講解,需要的朋友可以參考下2016-04-04
Android實(shí)現(xiàn)Activity水平和垂直滾動(dòng)條的方法
這篇文章主要介紹了Android實(shí)現(xiàn)Activity水平和垂直滾動(dòng)條的方法,涉及Activity的ScrollView設(shè)置相關(guān)技巧,需要的朋友可以參考下2016-07-07

