Android学习之自定义控件

来源:互联网 发布:网络管理用的软件 编辑:程序博客网 时间:2024/04/28 16:50

常用的自定义控件的方式大致有三种:

        1.继承自现有控件,加以改进,如继承TextView;

        2.将几种控件进行组合,构成新的组件;

        3.继承View类,重绘一个组件。

自定义控件的方法:

首先定义一个自定义控件类(MyView.java):

</pre><pre name="code" class="html">package com.jtext.chessdisplay;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.Toast;public class MyView extends View{Context context1;// TODO Auto-generated constructor stubpublic MyView(Context context, AttributeSet attrs) {super(context, attrs);context1=context;// TODO Auto-generated constructor stub}@Overrideprotected void onDraw(Canvas canvas){super.onDraw(canvas);Paint paint=new Paint();paint.setColor(Color.RED);paint.setShadowLayer(2, 3, 4, Color.GRAY);Rect r=new Rect(40,40,200,100);canvas.drawRect(r,paint);paint.setColor(Color.BLUE);    canvas.drawText("自定义控件测试", 40, 40, paint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubswitch (event.getAction()){case MotionEvent.ACTION_DOWN:Toast.makeText(context1, "自定义组件测试",0).show();break;case MotionEvent.ACTION_MOVE:Toast.makeText(context1, "HUAHUA",0).show();break;}return super.onTouchEvent(event);} }

接着,就可以像普通控件一样,在布局里声明使用(myview.xml):

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"     >  <com.jtext.chessdisplay.MyView       android:layout_width="wrap_content"       android:layout_height="wrap_content"      android:id="@+id/myView"        />  </LinearLayout>
最后,在MainActivity里显示:

package com.jtext.chessdisplay;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends Activity {    MyView2 mv;    MyView2 mv1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.myview);}}


二、组合控件

以继承布局类来自定义控件为例.

布局myview2

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >  <ImageView       android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:id="@+id/iv"      android:layout_gravity="center_vertical"/>  <TextView       android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:id="@+id/tv"      android:layout_gravity="center_vertical"      android:gravity="center_horizontal"/></LinearLayout>
控件定义MyView2.java

package com.jtext.chessdisplay;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;public class MyView2 extends LinearLayout{ private ImageView iv; private TextView tv; int i=0; Context context1;public MyView2(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubLayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);      inflater.inflate(R.layout.myview2, this);     iv=(ImageView) findViewById(R.id.iv);      tv=(TextView)findViewById(R.id.tv);      context1=context;    iv.setOnTouchListener(new myTouchListener());}public void setImageResource(int resid){iv.setImageResource(resid);}public void setTextView(String str,int color){tv.setText(str);tv.setTextColor(color);}class myTouchListener implements  OnTouchListener {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubswitch (v.getId()){case R.id.iv:i++;Toast.makeText(context1, "数量更改成功", 0).show();    tv.setText(i+"");;break;}return false;}}}
MainActivity里进行显示:

package com.jtext.chessdisplay;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends Activity {    MyView2 mv;    MyView2 mv1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.myview3);mv=(MyView2)findViewById(R.id.mv);mv1=(MyView2)findViewById(R.id.mv1);mv.setImageResource(R.drawable.cart);mv.setTextView("测试", Color.RED);mv1.setImageResource(R.drawable.cart);mv1.setTextView("测试", Color.BLUE);}}
             






0 0
原创粉丝点击