Android学习之自定义控件
2015-09-21 21:05
316 查看
常用的自定义控件的方式大致有三种:
1.继承自现有控件,加以改进,如继承TextView;
2.将几种控件进行组合,构成新的组件;
3.继承View类,重绘一个组件。
自定义控件的方法:
首先定义一个自定义控件类(MyView.java):
接着,就可以像普通控件一样,在布局里声明使用(myview.xml):
二、组合控件
以继承布局类来自定义控件为例.
布局myview2
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 stub public MyView(Context context, AttributeSet attrs) { super(context, attrs); context1=context; // TODO Auto-generated constructor stub } @Override protected 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); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub switch (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; @Override protected 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 stub LayoutInflater 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 { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch (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; @Override protected 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); } }
相关文章推荐
- Android学习进阶路线导航线路(Android源码分享) ...
- Android 之Adapter
- Android Studio导出的密钥签名市场认证安装包
- android 读取sd卡中的图片
- android studio 导入高德地图 INSTALL_FAILED_CPU_ABI_INCOMPATIBLE错误
- Android内存管理之SoftReference
- Android(java)学习笔记261:JNI之编写jni程序适配所有处理器型号
- android2.3平台上web页面(html5中使用frame)不能滑动、不允许缩放的解决方法
- [Android] 混音线程MixerThread
- Android Studio导入Project的方法
- Android(java)学习笔记260:JNI之native方法头文件的生成
- Android Message和obtainMessage的区别
- Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系
- 关于Android基本动画的应用
- 最流行的android组件大全
- Android开发之对话框
- Android基础入门教程——2.4.6 ListView的数据更新问题
- Android Text Layout 框架
- Android Handler 异步消息处理机制 《第一行代码》
- Android 发送Post请求上传图片(以InputStream为数据交互)