android绘制花边view-WaveLineView


项目开发中需要开发漂亮的界面,其中一些界面需要花边

例如:

android绘制花边view-WaveLineView_第1张图片

如果切图切整一条,那么他只适用于该分辨率的手机,如果放到其它手机上或放到平板上,他就会被拉长,用.9图也是一样会被拉长,那么该怎么办呢?

对于这种情况,我们只好切出波浪线重复的那一部分:

android绘制花边view-WaveLineView_第2张图片

img_wave.png

拿到这部分之后,我们开始自定义一个view,用view的ondraw绘制横向绘制这个重复部分、

绘制之前,我们需要将img_wave放大到view得高度:

[java]  view plain copy print ?
  1. float scale = getMeasuredHeight()*1f/bitmap.getHeight();  
  2. float width = bitmap.getWidth()*1f*scale;  

同时也需要计算绘制的个数,让绘制的效果达到最好:

[java]  view plain copy print ?
  1. waveCount = (int)(getMeasuredWidth()*1f/bitmap.getWidth())+1;  

 上面+1的原因是因为让它多出一个,足以铺满,

+1个之后宽度超出view宽度,再重新计算img_wavw的绘制宽度及缩放比例:

[java]  view plain copy print ?
  1. waveWidth = width - ((width*waveCount-getMeasuredWidth())/waveCount);  
  2. waveScale = waveWidth*1f/bitmap.getWidth();  

最后,横向绘制波浪:

[java]  view plain copy print ?
  1. matrix.setScale(waveScale, waveScale);  
  2. for (int i = 0; i < waveCount; i++) {  
  3. canvas.drawBitmap(bitmap_wave.get(), matrix, paint);  
  4. matrix.postTranslate(waveWidth, 0);  
  5. }  


最后效果图如下:



是不是很棒?最后贴出代码,希望能帮到大家:

[html]  view plain copy print ?
  1. /**  
  2.  * 无缝花边  
  3.  * @author touch_ping  
  4.  *  
  5.  */  
  6. public class WaveLineView extends View {  
  7.     private final static int waveRes = R.drawable.img_wave;  
  8.     private static SoftReference<Bitmap> bitmap_wave;// 背景  
  9.     private Context mcontext;  
  10.     private static Paint paint;  
  11.     private static Matrix matrix;  
  12.     private static float waveWidth;  
  13.     private static float waveScale;  
  14.     private static int waveCount;  
  15.       
  16.     public WaveLineView(Context context) {  
  17.         super(context);  
  18.         init(context);  
  19.     }  
  20.   
  21.     public WaveLineView(Context context, AttributeSet attrs) {  
  22.         super(context, attrs, 0);  
  23.         init(context);  
  24.     }  
  25.       
  26.     private void init (Context context) {  
  27.         mcontext = context;  
  28.     }  
  29.       
  30.   
  31.     @Override  
  32.     protected void onDraw(Canvas canvas) {  
  33.         super.onDraw(canvas);  
  34.         if (paint==null) {  
  35.             paint = new Paint();  
  36.         }  
  37.         if (matrix==null) {  
  38.             matrix = new Matrix();  
  39.         }  
  40.         if (bitmap_wave==null || bitmap_wave.get()==null) {  
  41.             // 从资源文件中生成位图     
  42.             Bitmap bitmap = BitmapFactory.decodeResource(getResources(), waveRes);  
  43.               
  44.             float scale = getMeasuredHeight()*1f/bitmap.getHeight();  
  45.             float width = bitmap.getWidth()*1f*scale;  
  46.             waveCount = (int)(getMeasuredWidth()*1f/width)+1;  
  47.               
  48.             waveWidth = width - ((width*waveCount-getMeasuredWidth())/waveCount);  
  49.             waveScale = waveWidth*1f/bitmap.getWidth();  
  50.               
  51.             bitmap_wave = new SoftReference<Bitmap>(bitmap);  
  52.         }  
  53.           
  54.         matrix.setScale(waveScale, waveScale);  
  55.         for (int i = 0; i < waveCount; i++) {  
  56.             canvas.drawBitmap(bitmap_wave.get(), matrix, paint);  
  57.             matrix.postTranslate(waveWidth, 0);  
  58.         }  
  59.     }  
  60. }  

你可能感兴趣的:(android绘制花边view-WaveLineView)