可以从bitmap、color

public class StreamDrawable extends Drawable {// Publicpublic static final int CORNER_RADIUS = 12; // dipspublic static final int MARGIN = 5; // dips, 抹掉一些边缘/* * @desc Calculate by Display's density(密度) * */public static int getDefaultCornerRadius(Context context) {final float density = context.getResources().getDisplayMetrics().density;        return (int) (CORNER_RADIUS * density + 0.5f);}public static int getDefaultMargin(Context context) {final float density = context.getResources().getDisplayMetrics().density;return (int) (MARGIN * density + 0.5f);}// Privateprivate static final boolean USE_VIGNETTE = false;/* 让中间产生一个空洞,在周围形成一种环状带的效果 */private final float m_CornerRadius;private final RectF m_RectF = new RectF();private final BitmapShader m_BitmapShader;private final Paint m_Paint;private final int m_Margin; /* edge *//* * @desc Create from bitmap *  * @call Using, .setBackground(Drawable) * */public StreamDrawable(Context context, int drawableId, float cornerRadius, int margin) {this(BitmapFactory.decodeResource(context.getResources(), drawableId), cornerRadius, margin);}public StreamDrawable(Bitmap bitmap, float cornerRadius, int margin) {m_CornerRadius = cornerRadius;m_Margin = margin;m_BitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);m_Paint = new Paint();m_Paint.setAntiAlias(true);m_Paint.setShader(m_BitmapShader);}/* * @desc Create form color *  * @param colorId, need to getResource().getColor() * */public StreamDrawable(int colorId, Context context) {this(colorId, getDefaultCornerRadius(context), getDefaultMargin(context));}public StreamDrawable(int colorId, float cornerRadius, int margin) {this(colorId, 3,  3, cornerRadius, margin);}public StreamDrawable(int colorId, int w, int h, float cornerRadius, int margin) {m_CornerRadius = cornerRadius;m_Margin = margin;Bitmap bitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);Canvas canvasTemp = new Canvas(bitmap);    canvasTemp.drawColor(colorId);m_BitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);m_Paint = new Paint();m_Paint.setAntiAlias(true);m_Paint.setShader(m_BitmapShader);}@Overrideprotected void onBoundsChange(Rect bounds) {super.onBoundsChange(bounds);m_RectF.set(m_Margin, m_Margin, bounds.width() - m_Margin, bounds.height() - m_Margin);             if (USE_VIGNETTE) {              RadialGradient vignette = new RadialGradient(              m_RectF.centerX(), m_RectF.centerY() * 1.0f / 0.7f, m_RectF.centerX() * 1.3f,                      new int[] { 0, 0, 0x7f000000 }, new float[] { 0.0f, 0.7f, 1.0f },                      TileMode.CLAMP);                 Matrix oval = new Matrix();              oval.setScale(1.0f, 0.7f);              vignette.setLocalMatrix(oval);                 m_Paint.setShader(                      new ComposeShader(m_BitmapShader, vignette, PorterDuff.Mode.SRC_OVER));          }}@Overridepublic void draw(Canvas canvas) {canvas.drawRoundRect(m_RectF, m_CornerRadius, m_CornerRadius, m_Paint);}@Overridepublic void setAlpha(int alpha) {m_Paint.setAlpha(alpha);}@Overridepublic void setColorFilter(ColorFilter cf) {m_Paint.setColorFilter(cf);}@Overridepublic int getOpacity() {return PixelFormat.TRANSLUCENT;}}



这是所参考的代码:http://www.2cto.com/kf/201308/236427.html

package com.example.roundrectshader;     import android.os.Bundle;  import android.view.LayoutInflater;  import android.view.View;  import android.view.ViewGroup;  import android.view.ViewGroup.LayoutParams;  import android.widget.ArrayAdapter;  import android.widget.ListView;  import android.widget.TextView;  import android.app.Activity;  import android.content.Context;  import android.graphics.Bitmap;  import android.graphics.BitmapFactory;  import android.graphics.BitmapShader;  import android.graphics.Canvas;  import android.graphics.ColorFilter;  import android.graphics.ComposeShader;  import android.graphics.Matrix;  import android.graphics.Paint;  import android.graphics.PixelFormat;  import android.graphics.PorterDuff;  import android.graphics.RadialGradient;  import android.graphics.Rect;  import android.graphics.RectF;  import android.graphics.Shader;  import android.graphics.drawable.Drawable;     public class StreamActivity extends Activity {      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);             setContentView(R.layout.activity_stream);             StreamAdapter adapter = new StreamAdapter(this);          ((ListView) findViewById(R.id.main_list)).setAdapter(adapter);             adapter.add(new StreamItem(this, R.drawable.photo1, "Tufa at night", "Mono Lake, CA"));          adapter.add(new StreamItem(this, R.drawable.photo2, "Starry night", "Lake Powell, AZ"));          adapter.add(new StreamItem(this, R.drawable.photo3, "Racetrack playa", "Death Valley, CA"));          adapter.add(new StreamItem(this, R.drawable.photo4, "Napali coast", "Kauai, HI"));          adapter.add(new StreamItem(this, R.drawable.photo5, "Delicate Arch", "Arches, UT"));          adapter.add(new StreamItem(this, R.drawable.photo6, "Sierra sunset", "Lone Pine, CA"));          adapter.add(new StreamItem(this, R.drawable.photo7, "Majestic", "Grand Teton, WY"));      }         class StreamItem {          final Bitmap mBitmap;          final String mLine1;          final String mLine2;             StreamItem(Context c, int resid, String line1, String line2) {              mBitmap = BitmapFactory.decodeResource(c.getResources(), resid);              mLine1 = line1;              mLine2 = line2;          }      }         class StreamDrawable extends Drawable {          private static final boolean USE_VIGNETTE = true;             private final float mCornerRadius;          private final RectF mRect = new RectF();          private final BitmapShader mBitmapShader;          private final Paint mPaint;          private final int mMargin;             StreamDrawable(Bitmap bitmap, float cornerRadius, int margin) {              mCornerRadius = cornerRadius;                 mBitmapShader = new BitmapShader(bitmap,                      Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);                 mPaint = new Paint();              mPaint.setAntiAlias(true);              mPaint.setShader(mBitmapShader);                 mMargin = margin;          }             @Override          protected void onBoundsChange(Rect bounds) {              super.onBoundsChange(bounds);              mRect.set(mMargin, mMargin, bounds.width() - mMargin, bounds.height() - mMargin);                 if (USE_VIGNETTE) {                  RadialGradient vignette = new RadialGradient(                          mRect.centerX(), mRect.centerY() * 1.0f / 0.7f, mRect.centerX() * 1.3f,                          new int[] { 0, 0, 0x7f000000 }, new float[] { 0.0f, 0.7f, 1.0f },                          Shader.TileMode.CLAMP);                         Matrix oval = new Matrix();                  oval.setScale(1.0f, 0.7f);                  vignette.setLocalMatrix(oval);                         mPaint.setShader(                          new ComposeShader(mBitmapShader, vignette, PorterDuff.Mode.SRC_OVER));              }          }             @Override          public void draw(Canvas canvas) {              canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mPaint);          }             @Override          public int getOpacity() {              return PixelFormat.TRANSLUCENT;          }             @Override          public void setAlpha(int alpha) {              mPaint.setAlpha(alpha);          }             @Override          public void setColorFilter(ColorFilter cf) {              mPaint.setColorFilter(cf);          }             }            class StreamAdapter extends ArrayAdapter<StreamItem> {          private static final int CORNER_RADIUS = 24; // dips          private static final int MARGIN = 12; // dips             private final int mCornerRadius;          private final int mMargin;          private final LayoutInflater mInflater;             public StreamAdapter(Context context) {              super(context, 0);                             final float density = context.getResources().getDisplayMetrics().density;              mCornerRadius = (int) (CORNER_RADIUS * density + 0.5f);              mMargin = (int) (MARGIN * density + 0.5f);                 mInflater = LayoutInflater.from(getContext());          }             @Override          public View getView(int position, View convertView, ViewGroup parent) {              ViewGroup view = null;                             if (convertView == null) {                  view = (ViewGroup) mInflater.inflate(R.layout.stream_item, parent, false);              } else {                  view = (ViewGroup) convertView;              }                 StreamItem item = getItem(position);                 StreamDrawable d = new StreamDrawable(item.mBitmap, mCornerRadius, mMargin);              view.setBackgroundDrawable(d);                 ((TextView) view.findViewById(R.id.textView1)).setText(item.mLine1);              ((TextView) view.findViewById(R.id.textView2)).setText(item.mLine2);                 int w = item.mBitmap.getWidth();              int h = item.mBitmap.getHeight();                 float ratio = w / (float) h;                 LayoutParams lp = view.getLayoutParams();              lp.width = getContext().getResources().getDisplayMetrics().widthPixels;              lp.height = (int) (lp.width / ratio);                 return view;          }      }  }   package com.example.roundrectshader; import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.ColorFilter;import android.graphics.ComposeShader;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.PorterDuff;import android.graphics.RadialGradient;import android.graphics.Rect;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.drawable.Drawable; public class StreamActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);         setContentView(R.layout.activity_stream);         StreamAdapter adapter = new StreamAdapter(this);        ((ListView) findViewById(R.id.main_list)).setAdapter(adapter);         adapter.add(new StreamItem(this, R.drawable.photo1, "Tufa at night", "Mono Lake, CA"));        adapter.add(new StreamItem(this, R.drawable.photo2, "Starry night", "Lake Powell, AZ"));        adapter.add(new StreamItem(this, R.drawable.photo3, "Racetrack playa", "Death Valley, CA"));        adapter.add(new StreamItem(this, R.drawable.photo4, "Napali coast", "Kauai, HI"));        adapter.add(new StreamItem(this, R.drawable.photo5, "Delicate Arch", "Arches, UT"));        adapter.add(new StreamItem(this, R.drawable.photo6, "Sierra sunset", "Lone Pine, CA"));        adapter.add(new StreamItem(this, R.drawable.photo7, "Majestic", "Grand Teton, WY"));    }     class StreamItem {        final Bitmap mBitmap;        final String mLine1;        final String mLine2;         StreamItem(Context c, int resid, String line1, String line2) {            mBitmap = BitmapFactory.decodeResource(c.getResources(), resid);            mLine1 = line1;            mLine2 = line2;        }    }     class StreamDrawable extends Drawable {        private static final boolean USE_VIGNETTE = true;         private final float mCornerRadius;        private final RectF mRect = new RectF();        private final BitmapShader mBitmapShader;        private final Paint mPaint;        private final int mMargin;         StreamDrawable(Bitmap bitmap, float cornerRadius, int margin) {            mCornerRadius = cornerRadius;             mBitmapShader = new BitmapShader(bitmap,                    Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);             mPaint = new Paint();            mPaint.setAntiAlias(true);            mPaint.setShader(mBitmapShader);             mMargin = margin;        }         @Override        protected void onBoundsChange(Rect bounds) {            super.onBoundsChange(bounds);            mRect.set(mMargin, mMargin, bounds.width() - mMargin, bounds.height() - mMargin);             if (USE_VIGNETTE) {                RadialGradient vignette = new RadialGradient(                        mRect.centerX(), mRect.centerY() * 1.0f / 0.7f, mRect.centerX() * 1.3f,                        new int[] { 0, 0, 0x7f000000 }, new float[] { 0.0f, 0.7f, 1.0f },                        Shader.TileMode.CLAMP);                     Matrix oval = new Matrix();                oval.setScale(1.0f, 0.7f);                vignette.setLocalMatrix(oval);                     mPaint.setShader(                        new ComposeShader(mBitmapShader, vignette, PorterDuff.Mode.SRC_OVER));            }        }         @Override        public void draw(Canvas canvas) {            canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mPaint);        }         @Override        public int getOpacity() {            return PixelFormat.TRANSLUCENT;        }         @Override        public void setAlpha(int alpha) {            mPaint.setAlpha(alpha);        }         @Override        public void setColorFilter(ColorFilter cf) {            mPaint.setColorFilter(cf);        }           }      class StreamAdapter extends ArrayAdapter<StreamItem> {        private static final int CORNER_RADIUS = 24; // dips        private static final int MARGIN = 12; // dips         private final int mCornerRadius;        private final int mMargin;        private final LayoutInflater mInflater;         public StreamAdapter(Context context) {            super(context, 0);                         final float density = context.getResources().getDisplayMetrics().density;            mCornerRadius = (int) (CORNER_RADIUS * density + 0.5f);            mMargin = (int) (MARGIN * density + 0.5f);             mInflater = LayoutInflater.from(getContext());        }         @Override        public View getView(int position, View convertView, ViewGroup parent) {            ViewGroup view = null;                         if (convertView == null) {                view = (ViewGroup) mInflater.inflate(R.layout.stream_item, parent, false);            } else {                view = (ViewGroup) convertView;            }             StreamItem item = getItem(position);             StreamDrawable d = new StreamDrawable(item.mBitmap, mCornerRadius, mMargin);            view.setBackgroundDrawable(d);             ((TextView) view.findViewById(R.id.textView1)).setText(item.mLine1);            ((TextView) view.findViewById(R.id.textView2)).setText(item.mLine2);             int w = item.mBitmap.getWidth();            int h = item.mBitmap.getHeight();             float ratio = w / (float) h;             LayoutParams lp = view.getLayoutParams();            lp.width = getContext().getResources().getDisplayMetrics().widthPixels;            lp.height = (int) (lp.width / ratio);             return view;        }    }}


更多相关文章

  1. Android中.9.png图片的使用过程和原理
  2. android 按比例缩放图片(适屏)
  3. android中dp和px的转换
  4. Android(安卓)支持多屏幕机制
  5. 【转】Android(安卓)图标规格
  6. 最全面Android屏幕适配解决方案
  7. Android(安卓)dpi,dp,dip,px的关系
  8. android多分辨力支持 密度与分辨力
  9. Android屏幕适配;知识点+攻略+面试要点

随机推荐

  1. ubuntu下eclipse Android(安卓)ADT中SDK
  2. 回忆录——国庆
  3. Android 基础知识介绍
  4. Android 通过代码实现控制数据网络的开关
  5. android studio 无法在线更新解决
  6. ViewPager实现Android向导页
  7. Android之SQLite开发(2)—SQLiteOpenHelper
  8. android屏幕的适配
  9. android的tabHost的使用
  10. Android : gen already exists but is no