您好,登錄后才能下訂單哦!
這篇文章主要介紹“Android Canvas和Bitmap的結合繪圖流程是什么”,在日常操作中,相信很多人在Android Canvas和Bitmap的結合繪圖流程是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Android Canvas和Bitmap的結合繪圖流程是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
存儲四個值的矩形類:左側(cè)、頂部、右側(cè)和底部??捎糜谥苯釉诋嫴忌侠L制或僅用于存儲要繪制的對象的大小。Rect和RectF類之間的區(qū)別在于 RectF 存儲浮點值,而Rect類存儲整數(shù)。
private static Bitmap createDrawableBitmap(Drawable drawable) { int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); if (width <= 0 || height <= 0) { return null; } float scale = Math.min(1.0f, ((float) MAX_IMAGE_SIZE) / ((float) (width * height))); if ((drawable instanceof BitmapDrawable) && scale == 1.0f) { return ((BitmapDrawable) drawable).getBitmap(); } int bitmapWidth = (int) (((float) width) * scale); int bitmapHeight = (int) (((float) height) * scale); Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Rect existingBounds = drawable.getBounds(); int left = existingBounds.left; int top = existingBounds.top; int right = existingBounds.right; int bottom = existingBounds.bottom; drawable.setBounds(0, 0, bitmapWidth, bitmapHeight); drawable.draw(canvas); drawable.setBounds(left, top, right, bottom); return bitmap; }
一個3 x 3的矩陣,用于存儲可用于轉(zhuǎn)換畫布的信息。矩陣可以存儲以下類型的變換信息:縮放、傾斜、旋轉(zhuǎn)、平移。而每種變換方式都對應著三種方法:set方法將用新值替換當前的Matrix,不管之前Matrix的值是什么。pre和post 方法將在當前Matrix包含的任何內(nèi)容之前或之后應用新的轉(zhuǎn)換。
Matrix m = new Matrix(); m.setRotate(90); m.setScale(3f,1f); m.setTranslate(200, 200);
只有平移,旋轉(zhuǎn)值和縮放值被重置
Matrix m = new Matrix(); m.preScale(3f,1f); m.preTranslate(200f, 100f); m.postScale(0.5f, 1f); m.postTranslate(100f, 0f);
先進行平移(200f, 100f),然后進行縮放(3f, 1f),然后進行縮放(0.5f, 1f),最后進行平移(100f, 0f)
Matrix m = new Matrix(); m.postTranslate(200f, 0f); m.preScale(0.5f, 1f); m.setScale(1f, 1f); m.postScale(5f, 1f); m.preTranslate(200f, 100f);
先進行平移(200f, 100f),然后進行縮放(1f, 1f),最后進行縮放(5f, 1f)。因為用了set方法所以平移(200f, 0f)和縮放(0.5f, 1f)被覆蓋,不起作用
假如先進行平移(x, y),再進行縮放(sx, sy),那么看到的平移效果等同于(x*sx, y*sy),因為縮放是將整個畫布或者坐標系進行縮放的
Canvas相當于Android的畫布,可以把畫布想象成一塊內(nèi)存空間,也就是一個Bitmap。Canvas的API提供一整套在這個Bitmap上進行繪圖的操作方法。
drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)
使用指定的矩陣繪制位圖,繪制的時候會使用矩陣進行變換,矩陣和畫筆可以傳入空值
drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)
將傳入的源圖bitmap指定的矩形區(qū)域src繪制到目標矩形區(qū)域dst中,如果矩形區(qū)域src傳入空值,則表示繪制整個源圖到目標矩形區(qū)域dst中,繪制的時候源圖或子集自動縮放/平移以填充目標矩形。如果繪制對應的畫筆通過方法setMaskFilter指定了超出原始位圖寬/高的掩碼過濾器(如BlurMaskFilter),則會位圖將繼續(xù)被繪制,就像在具有CLAMP模式的著色器中一樣。因此,原始寬/高之外的顏色將是復制的邊緣顏色。因為源矩形區(qū)域src對應的坐標空間是相對于源圖的,而目標矩形區(qū)域dst對應的坐標空間是繪制視圖對應的坐標空間,因此要控制好對應的縮放因子。
drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)
矩陣示例:
Bitmap background = Bitmap.createBitmap((int)width, (int)height, Config.ARGB_8888); float originalWidth = originalImage.getWidth(); float originalHeight = originalImage.getHeight(); Canvas canvas = new Canvas(background); float scale = width / originalWidth; float xTranslation = 0.0f; float yTranslation = (height - originalHeight * scale) / 2.0f; Matrix transformation = new Matrix(); transformation.postTranslate(xTranslation, yTranslation); transformation.preScale(scale, scale); Paint paint = new Paint(); paint.setFilterBitmap(true); canvas.drawBitmap(originalImage, transformation, paint);
矩形區(qū)域示例:
public Bitmap cropCircle(Bitmap bitmap) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth()/2, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; }
位圖,點陣圖,可以理解為int[] buffer,用來存儲每個像素點的容器。
Bitmap.createBitmap(int width, int height, Bitmap.Config config)
Bitmap.createBitmap(Bitmap src)
Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)
Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height,Matrix m, boolean filter)
BitmapFactory.decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts)
BitmapFactory.decodeFile(String pathName, Options opts)
BitmapFactory.decodeStream(InputStream is, Rect outPadding,Options opts)
createBitmap生成示例:
public Bitmap transform(Bitmap source) { int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size); if (squaredBitmap != source) { source.recycle(); } Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig()); Canvas canvas = new Canvas(bitmap); Paint avatarPaint = new Paint(); BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); avatarPaint.setShader(shader); Paint outlinePaint = new Paint(); outlinePaint.setColor(Color.WHITE); outlinePaint.setStyle(Paint.Style.STROKE); outlinePaint.setStrokeWidth(STROKE_WIDTH); outlinePaint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, avatarPaint); canvas.drawCircle(r, r, r - STROKE_WIDTH / 2, outlinePaint); squaredBitmap.recycle(); return bitmap; }
BitmapFactory生成示例:
private static Bitmap decodeSampledBitmapFromUrl(String url, int reqWidth, int reqHeight) throws IOException { // First decode with inJustDecodeBounds=true to check dimensions final Options options = new Options(); options.inJustDecodeBounds = true; InputStream stream = fetchStream(url); BitmapFactory.decodeStream(stream, null, options); stream.close(); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; stream = fetchStream(url); Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options); stream.close(); return bitmap; } private static InputStream fetchStream(String urlString) throws IllegalStateException, IOException { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet request = new HttpGet(urlString); HttpResponse response = httpClient.execute(request); return response.getEntity().getContent(); } private static int calculateInSampleSize(Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { // Calculate ratios of height and width to requested height and width final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); // Choose the smallest ratio as inSampleSize value, this will guarantee // a final image with both dimensions larger than or equal to the // requested height and width. inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; }
注意:通過Bitmap.createBitmap生成的Bitmap對象是可變對象,可以向Bitmap上繪制內(nèi)容,而通過BitmapFactory生成的Bitmap對象必須指定BitmapFactory.Options.inMutable = true,否則就是不可變對象,不能向上面繪制內(nèi)容。
到此,關于“Android Canvas和Bitmap的結合繪圖流程是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。