Android實現(xiàn)圖片反轉、翻轉、旋轉、放大和縮小
**********************************************************************
android 實現(xiàn)圖片的翻轉
**********************************************************************
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 實現(xià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); } }); }
**********************************************************************
實現(xiàn)畫面淡入淡出效果可以用 :setAlpha(alpha);
alpha從255,逐漸遞減!
**********************************************************************
如何實現(xiàn)屏幕的滾動效果,這里有兩個關鍵點,一個是實現(xiàn)OnGestureListener,以便在觸摸事件發(fā)生的時候,被回調。包括按下,滾動等等,按照API文檔,需要分兩步來實現(xiàn)檢測手勢行為。
1)創(chuàng)建GestureDetector實例
2) 在onTouchEvent()方法中調用GestureDetector的onTouchEvent()方法。
另一個關鍵點是自己實現(xiàn)一個簡單的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平臺中處理圖片
**********************************************************************
操作圖像像素
現(xiàn)在你可以對單獨的像素進行處理了。通過使用android.graphics.Bitmap API中的getPixels,可以加載像素到一個整數(shù)數(shù)組中。
在本文例子中,你將按照一定規(guī)則對每一個像素實現(xiàn)著色。經(jīng)過這個處理后,所有的像素將被轉化為一個范圍在0到255的字節(jié)碼。
android.graphics.Bitmap API中的setPixels則用來加載這個整數(shù)數(shù)組到一個圖像中。
最后一步是通過ImageView變量mIV來更新屏幕。以下是實現(xiàn)這個染色過程的代碼片段。
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(); //設置縮小比例 double scale=0.8; //計算出這次要縮小的比例 scaleWidth=(float)(scaleWidth*scale); scaleHeight=(float)(scaleHeight*scale); //產(chǎn)生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); //產(chǎn)生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文件
<?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圖片處理的所有內容,包括android圖片反轉、android 圖片翻轉、android 圖片旋轉、實現(xiàn)畫面淡入淡出效果、android 圖片的放大和縮小以及教你在谷歌Android平臺中處理圖片。
- Android實現(xiàn)屏幕旋轉方法總結
- Android中利用matrix 控制圖片的旋轉、縮放、移動
- Android Tween動畫之RotateAnimation實現(xiàn)圖片不停旋轉效果實例介紹
- Android開發(fā) 旋轉屏幕導致Activity重建解決方法
- Android編程中調用Camera時預覽畫面有旋轉問題的解決方法
- Android開發(fā)之圖形圖像與動畫(二)Animation實現(xiàn)圖像的漸變/縮放/位移/旋轉
- Android 圖片縮放與旋轉的實現(xiàn)詳解
- Android編程實現(xiàn)RotateAnimation設置中心點旋轉動畫效果
- Android部分手機拍照后獲取的圖片被旋轉問題的解決方法
- android實現(xiàn)icon動態(tài)旋轉效果
相關文章
詳解Android中ViewPager的PagerTabStrip子控件的用法
這篇文章主要介紹了Android中ViewPager的PagerTabStrip子控件的用法,PagerTabStrip與PagerTitleStrip的用法基本相同,文中舉了兩個詳細的例子,需要的朋友可以參考下2016-03-03Android使用Pull解析器解析xml文件的實現(xiàn)代碼
Android使用Pull解析器解析xml文件的實現(xiàn)代碼,需要的朋友可以參考一下2013-02-02Fragment跳轉時傳遞參數(shù)及結果回傳的方法(推薦)
今天總結一下Fragment間的參數(shù)傳遞及結果返回的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下2017-01-01Android Studio 新手入門教程(一)基本設置圖解
這篇文章主要介紹了Android Studio 新手入門教程(一)基本設置圖解,需要的朋友可以參考下2017-12-12Android開發(fā)之DatePicker和TimePicker實現(xiàn)選擇日期時間功能示例
這篇文章主要介紹了Android開發(fā)之DatePicker和TimePicker實現(xiàn)選擇日期時間功能,結合實例形式分析了Android DatePicker和TimePicker組件的功能、常用函數(shù)、布局及日期時間選擇相關操作技巧,需要的朋友可以參考下2019-03-03Android實現(xiàn)Activity水平和垂直滾動條的方法
這篇文章主要介紹了Android實現(xiàn)Activity水平和垂直滾動條的方法,涉及Activity的ScrollView設置相關技巧,需要的朋友可以參考下2016-07-07