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(10, 40, 90, 66);  
  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.     }  
时间: 2024-11-01 12:04:45

android自定义button点击效果的相关文章

Android自定义button点击效果的两种方式_Android

我们在界面上经常会用到button按钮,但通常button点击后看不到点击的效果,如果用户连续点击了两次,就会报NAR错误,这样交互性就比较差了.如果我们自定义了button点击效果,比如我们点击了button能让我们看到我们确实点击了button按钮,这样就会有效的避免重复点击了. 自定义点击效果有两种方式,一种是在xml中定义,另一种是在代码中定义. 首先看一下如何在xml中定义: 在drawable下新建selector.xml文件:          <?xml version="

Android自定义button点击效果的两种方式

我们在界面上经常会用到button按钮,但通常button点击后看不到点击的效果,如果用户连续点击了两次,就会报NAR错误,这样交互性就比较差了.如果我们自定义了button点击效果,比如我们点击了button能让我们看到我们确实点击了button按钮,这样就会有效的避免重复点击了. 自定义点击效果有两种方式,一种是在xml中定义,另一种是在代码中定义. 首先看一下如何在xml中定义: 在drawable下新建selector.xml文件: <?xml version="1.0"

Android 自定义Button控件实现按钮点击变色_Android

效果图如下所示: 一.shape 样式:(在drawable新建-->new-->Drawable resource file 在父级标签selector添加Item ) <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item and

Android 自定义Button控件实现按钮点击变色

效果图如下所示: 一.shape 样式:(在drawable新建-->new-->Drawable resource file 在父级标签selector添加Item ) <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item and

android:自定义button继承自button, 调用setTextcolor无效

问题描述 android:自定义button继承自button, 调用setTextcolor无效 现在有个需求是当button失去焦点时, text文字的颜色会变化. 1. 在attrs.xml中我声明了两个属性normalColor和selectedColor, 2. 然后在自定义button类中: TypedArray typeArray = mContext.obtainStyledAttributes(attrs, R.styleable.LtButton); if (null !=

android开发-android eclipse button点击不能变换图片,要怎么解决呢?

问题描述 android eclipse button点击不能变换图片,要怎么解决呢? 开发-android eclipse button点击不能变换图片,要怎么解决呢?-eclipse button 事件"> 解决方案 解决方案二: 从写法上来说没看出问题,你可以试一下把bottom_button1.xml就只写一个item,分2次,看看有没有效果.然后一个个条件排除一下,看item设置中哪个条件不符合要求了. 解决方案三: 放置的顺序问题啊!!.item的顺序有个严格的要求:正常状态的

Android自定义View实现打字机效果_Android

一.先来看看效果演示 二.实现原理: 这个其实不难实现,通过一个定时器不断调用TextView的setText就行了,在setText的时候播放打字的音效. 具体代码如下: import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.media.MediaPlayer; import android.text.TextUtils; import android

Android自定义View实现打字机效果

一.先来看看效果演示 二.实现原理: 这个其实不难实现,通过一个定时器不断调用TextView的setText就行了,在setText的时候播放打字的音效. 具体代码如下: import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.media.MediaPlayer; import android.text.TextUtils; import android

Android 自定义View实现抽屉效果

Android 自定义View实现抽屉效果 说明 这个自定义View,没有处理好多点触摸问题 View跟着手指移动,没有采用传统的scrollBy方法,而是通过不停地重新布局子View的方式,来使得子View产生滚动效果menuView.layout(menuLeft, 0, menuLeft + menuWidth, menuHeight); 相应的,由于没有使用scrollBy方法,就没有产生getScrollX值,所以不能通过Scroller的startScroll方法来完成手指离开后的平