萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 安卓開發 >> androidBitmap圓角與倒影實現

androidBitmap圓角與倒影實現

/**
	 * 畫一個圓角圖
	 * 
	 * @param bitmap
	 * @param roundPx
	 * @return
	 */
	public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
		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());
		final RectF rectF = new RectF(rect);
		paint.setAntiAlias(true);
		canvas.drawARGB(0, 0, 0, 0);
		paint.setColor(color);
		canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
		paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
		canvas.drawBitmap(bitmap, rect, rect, paint);
		return output;
	}

	/**
	 * 創建倒影效果
	 * 
	 * @return
	 */
	public boolean createReflectedImages() {
		// 倒影圖和原圖之間的距離
		final int reflectionGap = 4;
		int index = 0;
		for (GalleryWith3DData imageId : mImageIds) {
			// 返回原圖解碼之後的bitmap對象
			Bitmap originalImage = BitmapFactory.decodeResource(
					mContext.getResources(), imageId.getInteger());
			int width = originalImage.getWidth();
			int height = originalImage.getHeight();
			// 創建矩陣對象
			Matrix matrix = new Matrix();
			// 指定矩陣(x軸不變,y軸相反)
			matrix.preScale(1, -1);
			// 將矩陣應用到該原圖之中,返回一個寬度不變,高度為原圖1/2的倒影位圖
			Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
					height / 2, width, height / 2, matrix, false);
			// 創建一個寬度不變,高度為原圖+倒影圖高度的位圖
			Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
					(height + height / 2), Config.ARGB_8888);
			// 將上面創建的位圖初始化到畫布
			Canvas canvas = new Canvas(bitmapWithReflection);
			canvas.drawBitmap(getRoundedCornerBitmap(originalImage, 20), 0, 0,
					null);
			int len = imageId.getstr().length();
			double lenWeght = len * 50 * 0.9;
			int ban = width / 2;
			int ban1 = (int) (lenWeght / 2);
			int hua = ban - ban1;
			if (imageId.getFlagRecommend()) {
				canvas.rotate(30);
				canvas.drawText(mStrRecommend, hua - 20, 150,
						createPaint(Color.RED));
				canvas.rotate(-30);
			}
			Paint deafaultPaint = new Paint();
			deafaultPaint.setAntiAlias(false);
			canvas.drawBitmap(getRoundedCornerBitmap(reflectionImage, 20), 0,
					height + reflectionGap, null);
			Paint paint = new Paint();
			paint.setAntiAlias(false);
	/**
	 * 參數一:為漸變起初點坐標x位置, 參數二:為y軸位置, 參數三和四:分辨對應漸變終點, 最後參數為平鋪方式,
	 * 這裡設置為鏡像Gradient是基於Shader類,所以我們通過Paint的setShader方法來設置這個漸變
	*/
			LinearGradient shader = new LinearGradient(0,
					originalImage.getHeight(), 0,
					bitmapWithReflection.getHeight() + reflectionGap,
					0x70ffffff, 0x00ffffff, TileMode.MIRROR);
			// 設置陰影
			paint.setShader(shader);
			paint.setXfermode(new PorterDuffXfermode(
					android.graphics.PorterDuff.Mode.DST_IN));
			// 用已經定義好的畫筆構建一個矩形陰影漸變效果
			canvas.drawRect(0, height, width, 
                           bitmapWithReflection.getHeight() + reflectionGap, paint);
			canvas.drawText(imageId.getstr(), hua, 430,
					createPaint(Color.WHITE));
			// 創建一個ImageView用來顯示已經畫好的bitmapWithReflection
			ImageView imageView = new ImageView(mContext);
			imageView.setImageBitmap(bitmapWithReflection);
			// 設置imageView大小 ,也就是最終顯示的圖片大小
			imageView.setLayoutParams(new GalleryWith3D.LayoutParams(150, 250));
			// imageView.setScaleType(ScaleType.MATRIX);
			mImages[index++] = imageView;
		}
		return true;
	}
copyright © 萬盛學電腦網 all rights reserved