android自定义button点击效果

简介: package com.min.androidtest;    import android.app.Activity;  import android.content.Context;  import android.graphics.Canvas;  import android.graphics.Color;  import android.graphics.Paint
  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.     }  

目录
相关文章
|
1月前
|
Android开发 开发者
安卓应用开发中的自定义视图
【9月更文挑战第37天】在安卓开发的海洋中,自定义视图犹如一座座小岛,等待着勇敢的探索者去发现其独特之处。本文将带领你踏上这段旅程,从浅滩走向深海,逐步揭开自定义视图的神秘面纱。
41 3
|
1月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
86 0
|
3月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
79 2
基于Android P,自定义Android开机动画的方法
|
3月前
|
供应链 物联网 区块链
未来触手可及:探索新兴技术的趋势与应用安卓开发中的自定义视图:从基础到进阶
【8月更文挑战第30天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和应用场景,带你领略未来的可能性。
|
3月前
|
测试技术 Android开发 Python
探索软件测试的艺术:从基础到高级安卓应用开发中的自定义视图
【8月更文挑战第29天】在软件开发的世界中,测试是不可或缺的一环。它如同艺术一般,需要精细的技巧和深厚的知识。本文旨在通过浅显易懂的语言,引领读者从软件测试的基础出发,逐步深入到更复杂的测试策略和工具的使用,最终达到能够独立进行高效测试的水平。我们将一起探索如何通过不同的测试方法来确保软件的质量和性能,就像艺术家通过不同的色彩和笔触来完成一幅画作一样。
|
20天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
22天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
30 5
|
1月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
2月前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
62 10
|
2月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
46 3