Android入门篇——Button控件+自定义Button控件

首先***步就是往布局文件里拖一个Button控件,当然自己码出来也可以。XML布局如下

创新互联一直秉承“诚信做人,踏实做事”的原则,不欺瞒客户,是我们最起码的底线! 以服务为基础,以质量求生存,以技术求发展,成交一个客户多一个朋友!为您提供成都做网站、成都网站制作、成都网页设计、微信小程序开发、成都网站开发、成都网站制作、成都软件开发、重庆APP软件开发是成都本地专业的网站建设和网站设计公司,等你一起来见证!

 
 
 
 
  1.     xmlns:tools="http://schemas.android.com/tools"
  2.     android:layout_width="match_parent"
  3.     android:layout_height="match_parent"
  4.     
  5.      >
  6.     
  7.         android:id="@+id/button1"             
  8.         android:layout_width="wrap_content"   
  9.         android:layout_height="wrap_content"  
  10.         android:layout_alignParentTop="true"  
  11.         android:layout_centerHorizontal="true"
  12.         android:layout_marginTop="150dp"      
  13.         android:text="Button" />              

当然,一个控件的布局属性还有很多,这些都是需要我们多用多熟悉才行。

然后再在程序中调用它

 
 
 
 
  1. public class MainActivity extends Activity {
  2.     
  3.     private Button myButton;
  4.     @Override
  5.     protected void onCreate(Bundle savedInstanceState) {
  6.         super.onCreate(savedInstanceState);
  7.         setContentView(R.layout.activity_main);
  8.         //通过id寻找控件,记得寻找控件前一定要先设置好布局文件
  9.         myButton = (Button)findViewById(R.id.button1);
  10.         myButton.setOnClickListener(new OnClickListener() {
  11.             
  12.             @Override
  13.             public void onClick(View v) {
  14.                 // TODO Auto-generated method stub
  15.                 //这里填写单击按钮后要执行的事件
  16.             }
  17.             
  18.         });
  19.         myButton.setOnTouchListener(new OnTouchListener(){...});//设置触碰到按钮的监听器
  20.         myButton.setOnLongClickListener(new OnLongClickListener(){...});//设置长按按钮的监听器
  21.         myButton.setOnHoverListener(new OnHoverListener(){...});//设置界面覆盖按钮时的监听器
  22.         //还有其它的的监听器,我们可以根据不同的需求来调用相应的监听器
  23.     }
  24. }

或者这样设置监听器

 
 
 
 
  1. public class MainActivity extends Activity implements OnClickListener{
  2.     
  3.     private Button myButton;
  4.     @Override
  5.     protected void onCreate(Bundle savedInstanceState) {
  6.         super.onCreate(savedInstanceState);
  7.         setContentView(R.layout.activity_main);
  8.         //寻找控件,记得寻找控件前一定要先设置好布局文件
  9.         myButton = (Button)findViewById(R.id.button1);
  10.         myButton.setOnClickListener(this);
  11.             
  12.     }
  13.     @Override
  14.     public void onClick(View v) {
  15.         // TODO Auto-generated method stub
  16.         //获取点击的View
  17.         switch(v.getId()){
  18.         //根据View的id来进行相关操作
  19.         case R.id.button1:
  20.             //按钮点击时处理相关的事件
  21.             break;
  22.         }
  23.     }
  24. }

这样一个基础功能的button控件就完成了。但当然,这不是我们今天要讲的重点,重点是我们如何自定义一个按钮,而不是使用系统给我们的按钮。

二、自定义按钮

我们先来看看效果图吧

这是一个自带进度条的按钮,它可以显示异步任务的进度,当完成后结束操作。我们来看看具体是怎么实现的吧。

  1. 拆分这个按钮。仔细观察上面的效果图,我们可以把这个按钮分成3个部分,首先是 最简单的外面一圈圆,基本上画出个圆放在那里就行了。接着是中间的三角形,正方形以及完成的勾,这个我们可以使用view里的画图类勾勒出来,再使用简单 的动画Animation来切换。***的一部分是覆盖在圆圈上的不断在表示进度的圆圈,这个我们可以不断调用这个view的ondraw来刷新进度。这就 是整个按钮的设计思路。我们来看看实际的代码吧。
  2. 首先是表示进度的圆圈,我们来新建一个CusImage继承view类,实时的传入进度参数。
 
 
 
 
  1. package com.example.mybutton;
  2. import android.annotation.SuppressLint;
  3. import android.content.Context;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Paint;
  7. import android.graphics.RectF;
  8. import android.util.AttributeSet;
  9. import android.util.DisplayMetrics;
  10. import android.util.Log;
  11. import android.view.View;
  12. @SuppressLint("ViewConstructor") 
  13. public class CusImage extends View {
  14.     private ButtonLayout b;
  15.     private Paint myPaint;
  16.     private float startAngle, sweepAngle;
  17.     private RectF rect;
  18.     // 默认控件大小
  19.     private int pix = 160;
  20.     public CusImage(Context context, ButtonLayout b) {
  21.         super(context);
  22.         this.b = b;
  23.         init();
  24.         // TODO Auto-generated constructor stub
  25.     }
  26.     public CusImage(Context context, AttributeSet attrs, ButtonLayout b) {
  27.         super(context, attrs);
  28.         this.b = b;
  29.         init();
  30.         // TODO Auto-generated constructor stub
  31.     }
  32.     private void init() {
  33.         myPaint = new Paint();
  34.         DisplayMetrics metrics = getContext().getResources()
  35.                 .getDisplayMetrics();
  36.         int width = metrics.widthPixels;
  37.         int height = metrics.heightPixels;
  38.         Log.d("TAG", width + "");
  39.         Log.d("TAG", height + "");
  40.         float scarea = width * height;
  41.         pix = (int) Math.sqrt(scarea * 0.0217);
  42.         //抗锯齿
  43.         myPaint.setAntiAlias(true);
  44.         //stroke表示空心,Fill表示实心
  45.         myPaint.setStyle(Paint.Style.STROKE);
  46.         //颜色
  47.         myPaint.setColor(Color.rgb(0, 161, 234));
  48.         //设置线条粗细
  49.         myPaint.setStrokeWidth(7);
  50.         float startx = (float) (pix * 0.05);
  51.         float endx = (float) (pix * 0.95);
  52.         float starty = (float) (pix * 0.05);
  53.         float endy = (float) (pix * 0.95);
  54.         //矩形区域
  55.         rect = new RectF(startx, starty, endx, endy);
  56.     }
  57.     @Override
  58.     protected void onDraw(Canvas canvas) {
  59.         // 画弧线
  60.         // 在rect这个区域内画,开始的角度,扫过的度数而不是结束的角度,false表示不与圆心连线,true通常用来画扇形,画笔。
  61.         canvas.drawArc(rect, startAngle, sweepAngle, false, myPaint);
  62.         startAngle = -90;
  63.         //小于1圈
  64.         if (sweepAngle < 360 &&b.flg_frmwrk_mode == 2) {
  65.             invalidate();
  66.         }else if(b.flg_frmwrk_mode == 1){
  67.                     
  68.         }else {//扫完一圈,调用b.finalAnimation()
  69.             sweepAngle = 0;
  70.             startAngle = -90;
  71.             b.finalAnimation();
  72.         }
  73.         super.onDraw(canvas);
  74.     }
  75.     /**
  76.      * 控制控件的大小 http://blog.csdn.net/pi9nc/article/details/18764863
  77.      **/
  78.     @Override
  79.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  80.         int desiredWidth = pix;
  81.         int desiredHeight = pix;
  82.         int widthMode = MeasureSpec.getMode(widthMeasureSpec);
  83.         int widthSize = MeasureSpec.getSize(widthMeasureSpec);
  84.         int heightMode = MeasureSpec.getMode(heightMeasureSpec);
  85.         int heightSize = MeasureSpec.getSize(heightMeasureSpec);
  86.         int width;
  87.         int height;
  88.         // 如果控件宽度是指定大小,宽度为指定的尺寸
  89.         if (widthMode == MeasureSpec.EXACTLY) {
  90.             width = widthSize;
  91.         } else if (widthMode == MeasureSpec.AT_MOST) { // 没有限制,默认内容大小
  92.             width = Math.min(desiredWidth, widthSize);
  93.         } else {
  94.             width = desiredWidth;
  95.         }
  96.         // 如果控件高度是指定大小,高度为指定的尺寸
  97.         if (heightMode == MeasureSpec.EXACTLY) {
  98.             height = heightSize;
  99.         } else if (heightMode == MeasureSpec.AT_MOST) {// 没有限制,默认内容大小
  100.             height = Math.min(desiredHeight, heightSize);
  101.         } else {
  102.             height = desiredHeight;
  103.         }
  104.         // 设定控件大小
  105.         setMeasuredDimension(width, height);
  106.     }
  107.     // 传入参数
  108.     public void setupprogress(int progress) {
  109.         sweepAngle = (float) (progress * 3.6);
  110.     }
  111.     public void reset() {
  112.         startAngle = -90;
  113.     }
  114. }

有了表示进度的view之后,我们要在一个viewgroup控件中组装各个部分来实现整个按钮,这里我用的是framelayout

这里代码写在一起了,我把它们一个一个拎出来讲解。

首先是ImageView的初始化

 
 
 
 
  1. /**
  2.      * 创建各个控件
  3.      */
  4.     private void initialise() {
  5.         // 按钮的进度条
  6.         cusView = new CusImage(getContext(), this);
  7.         // 按钮中间的形状
  8.         buttonimage = new ImageView(getContext());
  9.         // 完成进度后显示的图像
  10.         fillcircle = new ImageView(getContext());
  11.         //外面一圈圆
  12.         full_circle_image = new ImageView(getContext());
  13.         // 设置控件不接受点击事件
  14.         cusView.setClickable(false);
  15.         buttonimage.setClickable(false);
  16.         fillcircle.setClickable(false);
  17.         full_circle_image.setClickable(false);
  18.         setClickable(true);
  19.     }

然后是设置动画

 
 
 
 
  1. /**
  2.      * 设置动画及动画监听器
  3.      */
  4.     private void setAnimation() {
  5.         // Setting up and defining view animations.
  6.         // http://blog.csdn.net/congqingbin/article/details/7889778
  7.         // RELATIVE_TO_PARENT:与父控件的的中心为重点;RELATIVE_TO_SELF以自己为中心
  8.         // 左上角 分别为0.0f 0.0f 中心点为0.5f,0.5f 右下角1.0f,1.0f
  9.         /*
  10.          * arcRotation = new RotateAnimation(0.0f, 360.0f,
  11.          * Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
  12.          */
  13.         // 持续时间1000ms
  14.         // arcRotation.setDuration(500);
  15.         in = new AnimationSet(true);
  16.         out = new AnimationSet(true);
  17.         // http://blog.csdn.net/jason0539/article/details/16370405
  18.         out.setInterpolator(new AccelerateDecelerateInterpolator());
  19.         in.setInterpolator(new AccelerateDecelerateInterpolator());
  20.         // http://blog.csdn.net/xsl1990/article/details/17096501
  21.         scale_in = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,
  22.                 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
  23.                 0.5f);
  24.         scale_out = new ScaleAnimation(1.0f, 3.0f, 1.0f, 3.0f,
  25.                 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
  26.                 0.5f);
  27.         // 缩放动画,起始x轴的缩放为0,y轴的缩放为0,动画后,x,y轴大小与图像尺寸相同
  28.         // x,y可以把它当做宽度和高度
  29.         new_scale_in = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,
  30.                 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
  31.                 0.5f);
  32.         new_scale_in.setDuration(200);
  33.         // 透明度的动画
  34.         fade_in = new AlphaAnimation(0.0f, 1.0f);
  35.         fade_out = new AlphaAnimation(1.0f, 0.0f);
  36.         scale_in.setDuration(150);
  37.         scale_out.setDuration(150);
  38.         fade_in.setDuration(150);
  39.         fade_out.setDuration(150);
  40.         // 进入的动画集
  41.         in.addAnimation(scale_in);
  42.         in.addAnimation(fade_in);
  43.         // 退出的动画集
  44.         out.addAnimation(fade_out);
  45.         out.addAnimation(scale_out);
  46.         out.setAnimationListener(new AnimationListener() {
  47.             @Override
  48.             public void onAnimationStart(Animation animation) {
  49.                 // TODO Auto-generated method stub
  50.                 System.out.println("print this");
  51.             }
  52.             @Override
  53.             public void onAnimationRepeat(Animation animation) {
  54.                 // TODO Auto-generated method stub
  55.             }
  56.             @Override
  57.             public void onAnimationEnd(Animation animation) {
  58.                 // TODO Auto-generated method stub
  59.                 buttonimage.setVisibility(View.GONE);
  60.                 buttonimage.setImageBitmap(second_icon_bmp);
  61.                 buttonimage.setVisibility(View.VISIBLE);
  62.                 buttonimage.startAnimation(in);
  63.                 full_circle_image.setVisibility(View.VISIBLE);
  64.                 cusView.setVisibility(View.VISIBLE);
  65.                 flg_frmwrk_mode = 2;
  66.                 System.out.println("flg_frmwrk_mode" + flg_frmwrk_mode);
  67.             }
  68.         });
  69.         new_scale_in.setAnimationListener(new AnimationListener() {
  70.             @Override
  71.             public void onAnimationStart(Animation animation) {
  72.                 // TODO Auto-generated method stub
  73.             }
  74.             @Override
  75.             public void onAnimationRepeat(Animation animation) {
  76.                 // TODO Auto-generated method stub
  77.             }
  78.             @Override
  79.             public void onAnimationEnd(Animation animation) {
  80.                 // TODO Auto-generated method stub
  81.                 cusView.setVisibility(View.GONE);
  82.                 buttonimage.setVisibility(View.VISIBLE);
  83.                 buttonimage.setImageBitmap(third_icon_bmp);
  84.                 flg_frmwrk_mode = 3;
  85.                 buttonimage.startAnimation(in);
  86.             }
  87.         });
  88.     }

再接着是画出各个形状

 
 
 
 
  1. * 设置各个画面的路径
  2.    */
  3.   private void iconCreate() {
  4.       // Creating icons using path
  5.       // Create your own icons or feel free to use these
  6.       play = new Path();
  7.       play.moveTo(pix * 40 / 100, pix * 36 / 100);
  8.       play.lineTo(pix * 40 / 100, pix * 63 / 100);
  9.       play.lineTo(pix * 69 / 100, pix * 50 / 100);
  10.       play.close();
  11.       stop = new Path();
  12.       stop.moveTo(pix * 38 / 100, pix * 38 / 100);
  13.       stop.lineTo(pix * 62 / 100, pix * 38 / 100);
  14.       stop.lineTo(pix * 62 / 100, pix * 62 / 100);
  15.       stop.lineTo(pix * 38 / 100, pix * 62 / 100);
  16.       stop.close();
  17.       download_triangle = new Path();
  18.       download_triangle.moveTo(pix * 375 / 1000, (pix / 2)
  19.               + (pix * 625 / 10000) - (pix * 3 / 100));
  20.       download_triangle.lineTo(pix / 2, (pix * 625 / 1000)
  21.               + (pix * 625 / 10000) - (pix * 3 / 100));
  22.       download_triangle.lineTo(pix * 625 / 1000, (pix / 2)
  23.               + (pix * 625 / 10000) - (pix * 3 / 100));
  24.       download_triangle.close();
  25.       download_rectangle = new Path();
  26.       download_rectangle.moveTo(pix * 4375 / 10000, (pix / 2)
  27.               + (pix * 625 / 10000) - (pix * 3 / 100));
  28.       download_rectangle.lineTo(pix * 5625 / 10000, (pix / 2)
  29.               + (pix * 625 / 10000) - (pix * 3 / 100));
  30.       download_rectangle.lineTo(pix * 5625 / 10000, (pix * 375 / 1000)
  31.               + (pix * 625 / 10000) - (pix * 3 / 100));
  32.       download_rectangle.lineTo(pix * 4375 / 10000, (pix * 375 / 1000)
  33.               + (pix * 625 / 10000) - (pix * 3 / 100));
  34.       download_rectangle.close();
  35.       tick = new Path();
  36.       tick.moveTo(pix * 30 / 100, pix * 50 / 100);
  37.       tick.lineTo(pix * 45 / 100, pix * 625 / 1000);
  38.       tick.lineTo(pix * 65 / 100, pix * 350 / 1000);
  39.   }
  40.   /**
  41.    * 创建各个bitmap添加到framelayout中
  42.    */
  43.   public void init() {
  44.       // Defining and drawing bitmaps and assigning views to the layout
  45.       FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
  46.               FrameLayout.LayoutParams.WRAP_CONTENT,
  47.               FrameLayout.LayoutParams.WRAP_CONTENT);
  48.       lp.setMargins(10, 10, 10, 10);
  49.       fillcircle.setVisibility(View.GONE);
  50.       Bitmap.Config conf = Bitmap.Config.ARGB_8888; // see other conf types
  51.       Bitmap full_circle_bmp = Bitmap.createBitmap(pix, pix, conf);
  52.       Bitmap fill_circle_bmp = Bitmap.createBitmap(pix, pix, conf);
  53.       first_icon_bmp = Bitmap.createBitmap(pix, pix, conf); // Bitmap to draw
  54.                                                               // first icon(
  55.                                                               // Default -
  56.                                                               // Play )
  57.       second_icon_bmp = Bitmap.createBitmap(pix, pix, conf); // Bitmap to draw
  58.                                                               // second icon(
  59.                                                               // Default -
  60.                                                               // Stop )
  61.       third_icon_bmp = Bitmap.createBitmap(pix, pix, conf); // Bitmap to draw
  62.                                                               // third icon(
  63.                                                               // Default -
  64.                                                               // Tick )
  65.       Canvas first_icon_canvas = new Canvas(first_icon_bmp);
  66.       Canvas second_icon_canvas = new Canvas(second_icon_bmp);
  67.     

    本文名称:Android入门篇——Button控件+自定义Button控件
    文章转载:http://www.shufengxianlan.com/qtweb/news22/510822.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联