自定义控件,事件分发上传机制

用户交互设计师:提供想法及UI设计草图
视觉设计师:想法——真正界面效果图
不满足于标准化组件:没有做不到只有想不到
分析清楚 ①UI呈现②UI事件
API Guides——Animation and Graphics——Canvas and Drawable
In order to request an invalidate from a thread other than your main Activity's thread, you must call postInvalidate().
LinearLayout——ViewGroup——View
——————/
public class MyView extends View{
	int x,y;
	Paint paint;
	public MyView(Context context) {
		super(context);
		paint=new Paint();
		paint.setColor(Color.BLACK);
	}
	@Override
	protected void onDraw(Canvas canvas) {
		canvas.drawRect(x,y,x+60,y+40,paint);	//顺时针旋转
	}
}

public class MyActivity extends Activity {
	MyView myView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		myView=new MyView(this);
		setContentView(myView);
		new Thread(new Runnable() {
			@Override
			public void run() {
				while(!Thread.currentThread().isInterrupted()){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					myView.postInvalidate();	//重新调用onDraw
				}
			}
		}).start();
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		myView.y+=3;
		return false;
	}
}
——————/
public class MyActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		MyView myView=new MyView(this);
		myView.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(MyActivity.this,"myView",Toast.LENGTH_LONG).show();
			}
		});
		setContentView(myView);
	}
}
存在问题:点击屏幕任何地方都打印myView(画布很大,画的按钮小而已)


——————/
Android界面事件分类:①KeyEvent②TouchEvent③TrackBallEvent(轨迹球,已淘汰)
事件触发两种方法:①继承View时复写事件函数,如onTouchEvent(内部)②绑定监听器(外部) 
——————/事件分发上传机制
PhoneWindow也存在onTouchEven等函数
分发顺序:焦点子View——RootView——Window——Activity
如ListView,可为每行设置onClick但繁琐,简单方法上传到至父容器,通过Index索引
例如为MyView和MyActivity均复写如下函数:
public boolean onTouchEvent(MotionEvent event) {
	if(event.getAction()==MotionEvent.ACTION_DOWN){
		Log.i("lyl", " Touch_lyl");
	}
	return true/false;
}
MyView中返回True,则MyActivity中不打印,反之打印
——————/长按事件
@Override
public boolean onTouchEvent(MotionEvent event) {	//MyView中
	if(event.getAction()==MotionEvent.ACTION_UP){
		if(event.getEventTime()-event.getDownTime()>1000){
			Log.i("lyl", "Long Touch");
		}
	}
	return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值