android自定义button点击效果

  1. package com.min.androidtest;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Color;  
  7. import android.graphics.Paint;  
  8. import android.graphics.Rect;  
  9. import android.os.Bundle;  
  10. import android.util.Log;  
  11. import android.view.View;  
  12. import android.view.ViewGroup.LayoutParams;  
  13. import android.widget.Button;  
  14. import android.widget.LinearLayout;  
  15.   
  16. public class AndroidTest extends Activity {  
  17.     private static final String TAG = "AndroidTest";  
  18.   
  19.     private static LinearLayout ll;  
  20.     private Button mBtn;  
  21.     private MyView mMyView;  
  22.     private boolean mbClickFlg = false;  
  23.       
  24.     @Override  
  25.     public void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27. //        setContentView(R.layout.main);  
  28.           
  29.         // 设置画面布局  
  30.         ll = new LinearLayout(this.getBaseContext());  
  31.         ll.setOrientation(LinearLayout.VERTICAL);  
  32.   
  33.         // button  
  34.         mBtn = new Button(this.getBaseContext());  
  35.         mBtn.setText("Draw");  
  36.         //   
  37.         mBtn.setTextColor(0xff000000);  
  38.         mBtn.setTextSize(16);  
  39.         LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(  
  40.         LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  41.   
  42.         lp.topMargin = 5;  
  43.         lp.leftMargin = 5;  
  44.         ll.addView(mBtn, lp);  
  45.   
  46.         // 设置画图view  
  47.         LinearLayout.LayoutParams lp1 = new LinearLayout.LayoutParams(  
  48.                 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);  
  49.         lp1.weight = 1;  
  50.         Rect rect = new Rect(10409066);  
  51.         mMyView = new MyView(this.getBaseContext(), rect);  
  52.         mMyView.setOnClickListener(new View.OnClickListener() {  
  53.   
  54.             public void onClick(View v) {  
  55.                 // TODO Auto-generated method stub  
  56.                 Log.d(TAG, "mMyView clicked.");  
  57.                 if (mbClickFlg) {  
  58.                     mMyView.setStrText("Click Me");  
  59.                 } else {  
  60.                     mMyView.setStrText("Again...");  
  61.                 }  
  62.                 mbClickFlg = !mbClickFlg;  
  63.                 mMyView.postInvalidate();  
  64.             }  
  65.               
  66.         });  
  67.           
  68.         ll.addView(mMyView, lp1);  
  69.         setContentView(ll);  
  70.   
  71.         // 设置监听按钮点击事件  
  72.         mBtn.setOnClickListener(new View.OnClickListener() {  
  73.   
  74.             public void onClick(View v) {  
  75.                 // TODO Auto-generated method stub  
  76.                 mMyView.drawLine();  
  77.                 mMyView.postInvalidate();  
  78.             }  
  79.               
  80.         });  
  81.   
  82.     }  
  83.   
  84.     // 自定义画图类,继承自View类  
  85.     public class MyView extends View {     
  86.         private Paint paint;  
  87.         private boolean bDrawLineFlg = false;  
  88.         private Rect mRect;  
  89.         private String mStrText = "having";  
  90.           
  91.         MyView(Context context) {     
  92.             super(context);     
  93.             // 生成paint   
  94.             paint = new Paint();    
  95.         }  
  96.           
  97.         MyView(Context context, Rect rect) {     
  98.             super(context);  
  99.             // 生成paint   
  100.             paint = new Paint();  
  101.             mRect = rect;  
  102.         }  
  103.              
  104.         @Override    
  105.         protected void onDraw(Canvas canvas) {     
  106.             // TODO Auto-generated method stub     
  107.             super.onDraw(canvas);     
  108.               
  109.             // 填充整个画布  
  110.             canvas.drawColor(Color.GRAY);  
  111. //            canvas.drawRGB(255, 255, 255); // 也可以  
  112.   
  113.               
  114.               
  115.             // 画图  
  116.            if (bDrawLineFlg) {  
  117.                 Log.d(TAG, "drawing");  
  118.                   
  119.                 // Draw top 6 lines  
  120.                 paint.setColor(0xFFFFC0CB);    
  121.                 canvas.drawLine(mRect.left + 2, mRect.top, mRect.right - 2, mRect.top, paint);  
  122.                 canvas.drawLine(mRect.left + 1, mRect.top + 1, mRect.right -1, mRect.top + 1, paint);  
  123.                 for (int i = 2; i < 6; i++) {  
  124.                     canvas.drawLine(mRect.left, mRect.top + i, mRect.right, mRect.top + i, paint);  
  125.                 }  
  126.                   
  127.                 // Draw middle 14 lines  
  128.                 paint.setColor(0xFFFFB6C1);  
  129.                 for (int i = 6; i < 20; i++) {  
  130.                     canvas.drawLine(mRect.left, mRect.top + i, mRect.right, mRect.top + i, paint);  
  131.                 }  
  132.                   
  133.                 // Draw bottom 6 lines  
  134.                 paint.setColor(0xFFFFC0CB);  
  135.                 for (int i = 20; i < 24; i++) {  
  136.                     canvas.drawLine(mRect.left, mRect.top + i, mRect.right, mRect.top + i, paint);  
  137.                 }                 
  138.                 canvas.drawLine(mRect.left + 1, mRect.top + 24, mRect.right - 1, mRect.top + 24, paint);  
  139.                 canvas.drawLine(mRect.left + 2, mRect.top + 25, mRect.right - 2, mRect.top + 25, paint);  
  140.                   
  141.                 // draw text  
  142.                 paint.setColor(0xFF0000FF);  
  143.                 paint.setTextSize(16);  
  144.                 paint.setAntiAlias(true); // 消除锯齿  
  145.                 paint.setFlags(Paint.ANTI_ALIAS_FLAG); // 消除锯齿  
  146.                 try{  
  147.                     float widths[] = new float[mStrText.length()];  
  148.                     paint.getTextWidths(mStrText, widths);  
  149.                     float textWidth = 0.0f;  
  150.                     for(int i = 0; i < widths.length; i++) {  
  151.                         textWidth += widths[i];  
  152.                         Log.d(TAG, "widths[0] = " + widths[i]);  
  153.                     }  
  154.                     Log.d(TAG, "textWidth = " + textWidth);  
  155.                     float textSize = paint.getTextSize();  
  156.                     Log.d(TAG, "textSize = " + textSize);  
  157.                     canvas.drawText(mStrText,  
  158.                             mRect.left + (mRect.width() - textWidth) / 2,  
  159.                             mRect.bottom - (mRect.height() - textSize) / 2 - 3// add offset to y position  
  160.                             paint);  
  161.                 } catch(Exception e) {  
  162.                     e.printStackTrace();  
  163.                 }  
  164.            }  
  165.                  
  166.         }  
  167.           
  168.         public void drawLine() {  
  169.             // 设置画线标志  
  170.             bDrawLineFlg = !bDrawLineFlg;  
  171.             if (bDrawLineFlg) {  
  172.                 mBtn.setText("Hide");  
  173.             } else {  
  174.                 mBtn.setText("Draw");  
  175.             }  
  176.             Log.d(TAG, "to be draw");  
  177.         }  
  178.           
  179.         public void setStrText(String text) {  
  180.             mStrText = text;  
  181.         }  
  182.     }  

你可能感兴趣的:(android自定义button点击效果)