在安卓中,我们所用的UI组件一般都集成于基类android.view.View。在实际开发中,类库中的组件可能不能满足我们的需求,这时候就需要定义自己的View类了。
下面将会有一个实例:实现一个PicView类,用于显示一张图片,当触摸屏幕时,该图片就会出现在所触摸的地方。
首先,我们需要新建一个类,例如PicView,继承于android.view.View,重写onDraw()方法。
package com.example.movepic;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
/**PicView类继承于android.view.View类
* 构造函数初始化对象的位置
* 重写onDraw函数显示图片*/
public class PicView extends View{
public float bitmapX;
public float bitmapY;
public PicView(Context context) {
super(context);
// TODO 自动生成的构造函数存根
bitmapX = 290;
bitmapY = 140;
}
@Override
protected void onDraw(Canvas c){
super.onDraw(c);
Paint paint = new Paint();
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.p2);
c.drawBitmap(bitmap, bitmapX, bitmapY, paint);
//判断图片是否被回收
if(bitmap.isRecycled())
bitmap.recycle();
}
}
在MainActivity中新建PicView对象并设置监听事件。
这样即可定义并应用自己的View组件。package com.example.movepic; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.FrameLayout; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /**构造帧布局管理器 * 新建PicView对象并初始化 * 设置该View对象的触摸监听事件 * 把该对象添加到布局管理器中*/ FrameLayout frameLayout = (FrameLayout)findViewById(R.id.FrameLayout1); final PicView picView = new PicView(this); picView.setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent e) { // TODO 自动生成的方法存根 picView.bitmapX = e.getX(); picView.bitmapY = e.getY(); //重新绘制图片 picView.invalidate(); return false; } }); frameLayout.addView(picView); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }