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
- Android学习之自定义控件
- android学习笔记之自定义控件
- Android学习笔记之自定义控件--标题栏
- Android开发之--自定义控件学习
- Android学习之自定义控件背景
- Android开发学习之路-自定义控件
- android 自定义控件学习
- Android自定义控件学习
- android自定义控件--学习
- Android之自定义控件
- Android之自定义控件
- android之自定义控件
- Android自定义控件之自定义日历控件
- Android自定义控件之自定义组合控件
- Android 自定义控件之自定义组合控件
- Android自定义控件之自定义组合控件
- Android学习之自定义控件-圆环进度条加内圆填充进度
- android学习之创建自定义控件(续)
- Android Toast 学习笔记
- multiprocessing with ugly pickle
- 第一章,Java语言
- LeetCode 36 Valid Sudoku 数独子问题 子矩阵判别法
- LintCode--最小子数组
- Android学习之自定义控件
- Android与服务器交互
- HDU 5464Clarke and problem
- CentOS 7.1 安装ntfs-3g
- cc2530在ZSTACK中如何开启双串口模式(UART1中断方式)
- 【Matlab学习笔记】【函数学习】eps
- XAMPP和VMware Workstation占用443端口冲突的解决办法
- jsp中的stl标签库
- Objective-C入门13:类目