日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Bitmap和Canvas学习笔记

發布時間:2023/12/20 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Bitmap和Canvas学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

位圖是我們開發中最常用的資源,畢竟一個漂亮的界面對用戶是最有吸引力的。

1. 從資源中獲取位圖

可以使用BitmapDrawable或者BitmapFactory來獲取資源中的位圖。

當然,首先需要獲取資源:

??????? Resources res=getResources();

使用BitmapDrawable獲取位圖

  • 使用BitmapDrawable (InputStream is)構造一個BitmapDrawable;
  • 使用BitmapDrawable類的getBitmap()獲取得到位圖;
  • // 讀取InputStream并得到位圖 InputStream is=res.openRawResource(R.drawable.pic180); BitmapDrawable bmpDraw=new BitmapDrawable(is); Bitmap bmp=bmpDraw.getBitmap();

    或者采用下面的方式:

    BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180); Bitmap bmp=bmpDraw.getBitmap();

    使用BitmapFactory獲取位圖

    (Creates Bitmap objects from various sources, including files, streams, and byte-arrays.)

    使用BitmapFactory類decodeStream(InputStream is)解碼位圖資源,獲取位圖。

    ???? Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);

    BitmapFactory的所有函數都是static,這個輔助類可以通過資源ID、路徑、文件、數據流等方式來獲取位圖。

    以上方法在編程的時候可以自由選擇,在Android SDK中說明可以支持的圖片格式如下:png (preferred), jpg (acceptable), gif (discouraged),和bmp(Android SDK Support Media Format)。

    2. 獲取位圖的信息

    要獲取位圖信息,比如位圖大小、像素、density、透明度、顏色格式等,獲取得到Bitmap就迎刃而解了,這些信息在Bitmap的手冊中,這里只是輔助說明以下2點:

    • 在Bitmap中對RGB顏色格式使用Bitmap.Config定義,僅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如說RGB_555,在開發中可能需要注意這個小問題;
    • Bitmap還提供了compress()接口來壓縮圖片,不過AndroidSAK只支持PNG、JPG格式的壓縮;其他格式的需要Android開發人員自己補充了。
    3. 顯示位圖

    顯示位圖可以使用核心類Canvas,通過Canvas類的drawBirmap()顯示位圖,或者借助于BitmapDrawable來將Bitmap繪制到Canvas。當然,也可以通過BitmapDrawable將位圖顯示到View中。

    轉換為BitmapDrawable對象顯示位圖

    ??????? // 獲取位圖
    ??????? Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);
    ??????? // 轉換為BitmapDrawable對象
    ??????? BitmapDrawable bmpDraw=new BitmapDrawable(bmp);
    ??????? // 顯示位圖
    ??????? ImageView iv2 = (ImageView)findViewById(R.id.ImageView02);
    ?????? iv2.setImageDrawable(bmpDraw);

    使用Canvas類顯示位圖

    這兒采用一個繼承自View的子類Panel,在子類的OnDraw中顯示

    public class MainActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new Panel(this)); } class Panel extends View{ public Panel(Context context) { super(context); } public void onDraw(Canvas canvas){ Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180); canvas.drawColor(Color.BLACK); canvas.drawBitmap(bmp, 10, 10, null); } } }
    4. 位圖縮放

    (1)將一個位圖按照需求重畫一遍,畫后的位圖就是我們需要的了,與位圖的顯示幾乎一樣:drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)。

    (2)在原有位圖的基礎上,縮放原位圖,創建一個新的位圖:CreateBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

    (3)借助Canvas的scale(float sx, float sy) (Preconcat the current matrix with the specified scale.),不過要注意此時整個畫布都縮放了。

    (4)借助Matrix:

    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180); Matrix matrix=new Matrix();matrix.postScale(0.2f, 0.2f);Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);canvas.drawColor(Color.BLACK); canvas.drawBitmap(dstbmp, 10, 10, null);
    5. 位圖旋轉

    同樣,位圖的旋轉也可以借助Matrix或者Canvas來實現。

    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180); Matrix matrix=new Matrix();matrix.postScale(0.8f, 0.8f);matrix.postRotate(45);Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);canvas.drawColor(Color.BLACK); canvas.drawBitmap(dstbmp, 10, 10, null);

    旋轉效果:

    6.圖片水印的生成方法

    生成水印的過程。其實分為三個環節:第一,載入原始圖片;第二,載入水印圖片;第三,保存新的圖片。

    ?

    • /**
    • ??? * create thebitmapfrom a byte array
    • ??? *
    • ??? * @param src thebitmapobject you want proecss
    • ??? * @param watermark the water mark above the src
    • ??? * @return return abitmapobject ,if paramter's length is 0,return null
    • ??? */?
    • ??privateBitmap createBitmap( Bitmap src, Bitmap watermark )??
    • ?? {??
    • ?????? String tag ="createBitmap";??
    • ?????? Log.d( tag,"create a newbitmap");??
    • ?????if( src ==null)??
    • ?????? {??
    • ??????????returnnull;??
    • ?????? }??
    • ?
    • ?????intw = src.getWidth();??
    • ?????inth = src.getHeight();??
    • ?????intww = watermark.getWidth();??
    • ?????intwh = watermark.getHeight();??
    • ?????//create the new blankbitmap?
    • ?????? Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//創建一個新的和SRC長度寬度一樣的位圖?
    • ?????? Canvas cv =newCanvas( newb );??
    • ?????//draw src into?
    • ?????? cv.drawBitmap( src,0,0,null);//在 0,0坐標開始畫入src?
    • ?????//draw watermark into?
    • ?????? cv.drawBitmap( watermark, w - ww +5, h - wh +5,null);//在src的右下角畫入水印?
    • ?????//save all clip?
    • ?????? cv.save( Canvas.ALL_SAVE_FLAG );//保存?
    • ?????//store?
    • ?????? cv.restore();//存儲?
    • ?????returnnewb;??
    • ?? }?
    7.Canvas的save和restore

    onDraw方法會傳入一個Canvas對象,它是你用來繪制控件視覺界面的畫布。

    在onDraw方法里,我們經常會看到調用save和restore方法,它們到底是干什么用的呢?

    ? save:用來保存Canvas的狀態。save之后,可以調用Canvas的平移、放縮、旋轉、錯切、裁剪等操作。

    ? restore:用來恢復Canvas之前保存的狀態。防止save后對Canvas執行的操作對后續的繪制有影響。

    save和restore要配對使用(restore可以比save少,但不能多),如果restore調用次數比save多,會引發Error。save和restore之間,往往夾雜的是對Canvas的特殊操作。

    例如:我們先想在畫布上繪制一個右向的三角箭頭,當然,我們可以直接繪制,另外,我們也可以先把畫布旋轉90°,畫一個向上的箭頭,然后再旋轉回來(這種旋轉操作對于畫圓周上的標記非常有用)。然后,我們想在右下角有個20像素的圓,那么,onDraw中的核心代碼是:

    int px = getMeasuredWidth();

    int py = getMeasuredWidth();

    // Draw background

    canvas.drawRect(0, 0, px, py, backgroundPaint);

    canvas.save();

    canvas.rotate(90, px/2, py/2);????????????????

    // Draw up arrow

    canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);????????????????

    canvas.drawLine(px / 2, 0, px, py / 2, linePaint);

    canvas.drawLine(px / 2, 0, px / 2, py, linePaint);

    canvas.restore();

    // Draw circle

    canvas.drawCircle(px - 10, py - 10, 10, linePaint);

    效果如圖1所示:

    如果我們不調用save和restore會是什么樣子呢?如圖2所示:

    從這兩個圖中,我們就能看到圓圈位置的明顯差異。不進行Canvas的save和restore操作的話,所有的圖像都是在畫布旋轉90°后的畫布上繪制的。當執行完onDraw方法,系統自動將畫布恢復回來。save和restore操作執行的時機不同,就能造成繪制的圖形不同。

    本文參考: Android SDK

    ?????????????? moandroid.com

    ?????????????? http://www.cnblogs.com/xirihanlin/archive/2009/07/24/1530246.html

    轉載于:https://www.cnblogs.com/Free-Thinker/p/6721725.html

    總結

    以上是生活随笔為你收集整理的Android Bitmap和Canvas学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。