android - Draw border and shadow around a bitmap

activity_main.xml
 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:id="@+id/rl"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:padding="16dp"     tools:context=".MainActivity"     android:background="#f9f4f8"     >     <ImageView         android:id="@+id/iv"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_centerInParent="true"         />     <Button         android:id="@+id/btn"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="Draw Border"         android:layout_alignParentBottom="true"         android:layout_alignParentRight="true"         /> </RelativeLayout> 
MainActivity.java
 package com.cfsuman.me.androidcode;  import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.RelativeLayout;   public class MainActivity extends AppCompatActivity {     private Context mContext;     private Resources mResources;     private RelativeLayout mRelativeLayout;     private Button mBTN;     private ImageView mImageView;     private Bitmap mBitmap;      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          // Get the application context         mContext = getApplicationContext();          // Get the Resources         mResources = getResources();          // Get the widgets reference from XML layout         mRelativeLayout = (RelativeLayout) findViewById(R.id.rl);         mImageView = (ImageView) findViewById(R.id.iv);         mBTN = (Button) findViewById(R.id.btn);          // Get the bitmap resource id         simpulan int bitmapResourceID =R.drawable.avatar;          // Set an image to ImageView         mImageView.setImageBitmap(BitmapFactory.decodeResource(mResources, bitmapResourceID));          // Set a click listener for Button widget         mBTN.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 // Get the bitmap from drawable resources                 mBitmap = BitmapFactory.decodeResource(mResources, bitmapResourceID);                  // Add a border around the bitmap                 mBitmap = addBorderToBitmap(mBitmap, 10, Color.WHITE);                  // Add a border around the bitmap as shadow                 mBitmap = addBorderToBitmap(mBitmap, 3, Color.LTGRAY);                 // Set the ImageView image as drawable object                 mImageView.setImageBitmap(mBitmap);             }         });     }      // Custom method to add a border around bitmap     protected Bitmap addBorderToBitmap(Bitmap srcBitmap, int borderWidth, int borderColor){         // Initialize a new Bitmap to make it bordered bitmap         Bitmap dstBitmap = Bitmap.createBitmap(                 srcBitmap.getWidth() + borderWidth*2, // Width                 srcBitmap.getHeight() + borderWidth*2, // Height                 Bitmap.Config.ARGB_8888 // Config         );          /*             Canvas                 The Canvas class holds the "draw" calls. To draw something, you need 4 basic                 components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing                 into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint                 (to describe the colors and styles for the drawing).         */         // Initialize a new Canvas instance         Canvas canvas = new Canvas(dstBitmap);          // Initialize a new Paint instance to draw border         Paint paint = new Paint();         paint.setColor(borderColor);         paint.setStyle(Paint.Style.STROKE);         paint.setStrokeWidth(borderWidth);         paint.setAntiAlias(true);          /*             Rect                 Rect holds four integer coordinates for a rectangle. The rectangle is represented by                 the coordinates of its 4 edges (left, top, right bottom). These fields can be accessed                 directly. Use width() and height() to retrieve the rectangle's width and height.                 Note: most methods do not check to see that the coordinates are sorted correctly                 (i.e. left <= right and top <= bottom).         */         /*             Rect(int left, int top, int right, int bottom)                 Create a new rectangle with the specified coordinates.         */          // Initialize a new Rect instance         /*             We set left = border width /2, because android draw border in a shape             by covering both inner and outer side.             By padding half border size, we included full border inside the canvas.         */         Rect rect = new Rect(                 borderWidth / 2,                 borderWidth / 2,                 canvas.getWidth() - borderWidth / 2,                 canvas.getHeight() - borderWidth / 2         );          /*             public void drawRect (Rect r, Paint paint)                 Draw the specified Rect using the specified Paint. The rectangle will be filled                 or framed based on the Style in the paint.              Parameters                 r : The rectangle to be drawn.                 paint : The paint used to draw the rectangle          */         // Draw a rectangle as a border/shadow on canvas         canvas.drawRect(rect,paint);          /*             public void drawBitmap (Bitmap bitmap, float left, float top, Paint paint)                 Draw the specified bitmap, with its top/left corner at (x,y), using the specified                 paint, transformed by the current matrix.                  Note: if the paint contains a maskfilter that generates a mask which extends beyond                 the bitmap's original width/height (e.g. BlurMaskFilter), then the bitmap will be                 drawn as if it were in a Shader with CLAMP mode. Thus the color outside of the                 original width/height will be the edge color replicated.                  If the bitmap and canvas have different densities, this function will take care of                 automatically scaling the bitmap to draw at the same density as the canvas.              Parameters                 bitmap : The bitmap to be drawn                 left : The position of the left side of the bitmap being drawn                 top : The position of the top side of the bitmap being drawn                 paint : The paint used to draw the bitmap (may be null)         */          // Draw source bitmap to canvas         canvas.drawBitmap(srcBitmap, borderWidth, borderWidth, null);          /*             public void recycle ()                 Free the native object associated with this bitmap, and clear the reference to the                 pixel data. This will not free the pixel data synchronously; it simply allows it to                 be garbage collected if there are no other references. The bitmap is marked as                 "dead", meaning it will throw an exception if getPixels() or setPixels() is called,                 and will draw nothing. This operation cannot be reversed, so it should only be                 called if you are sure there are no further uses for the bitmap. This is an advanced                 call, and normally need not be called, since the normal GC process will free up this                 memory when there are no more references to this bitmap.         */         srcBitmap.recycle();          // Return the bordered circular bitmap         return dstBitmap;     } } 
More android examples

Komentar