转载:

Android: TouchDelegate tutorialI’ve been doing quite a lot ofAndroiddevelopment lately. Most of the time theAPI SpecificationandDev Guideare quite complete, but sometimes information is difficult to find. An example of this is theTouchDelegateclass. According to the Specification TouchDelegate is a “Helper class to handle situations where you want a view to have a larger touch area than its actual view bounds.”. That’s exactly what it does and most application developers are likely to feel the need to use it.
Since I couldn’t find an example on how to actually use it, I wrote this small tutorial. It’s rather easy, but does expect you have some very basic Android knowledge (eg. how to build and use an Activity).
First up: the simplest layout file in history: (eg. tutorial.xml)

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/FrameContainer"
android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageButton android:id="@+id/tutorial"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:src="@drawable/tutorial" />
</FrameLayout>



Put this file in res/layout/. Make sure you have a drawable (an image), called tutorial.png (or any other supported format) located in res/drawable/
The layout file only contains aFrameLayoutwith anImageButtonin it, which is all we need for this tutorial. I choose an ImageButton , but anyViewwill do.
If you have questions regarding the layout file, visit theUI guide.
First thing to do, is to reference our layout file in the Activity, using

1 setContentView(R.layout.tutorial);



In order to have a larger touch area than the actual view bounds, we need to get a hold of the parent of our ImageButton: the FrameLayoutcalled FrameContainer. Weposta smallRunnableon the UI thread. In that Runnable we instantiate aRectthat specifies the bounds for our TouchDelegate. We then get thehit rectangleof the tutorialButton. The coordinates of the Rect are public, so we change them to what we want them to be. In the example I made the touch area of the tutorial ImageButton larger on the right side. After we have our Rect, we build a TouchDelegate with it and we set that TouchDelegate to the parent of our tutorialButton. I added a random message in onClick for testing purposes.
Code snippet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
View mParent = findViewById(R.id.FrameContainer);
mParent.post(new Runnable() {
@Override
public void run() {
Rect bounds = new Rect();
ImageButton mTutorialButton = (ImageButton) findViewById(R.id.tutorial);
mTutorialButton.setEnabled(true);
mTutorialButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Toast.makeText(TouchDelegateActivity.this, "Test TouchDelegate", Toast.LENGTH_SHORT).show();
}
});

mTutorialButton.getHitRect(bounds);
bounds.right += 50;
TouchDelegate touchDelegate = new TouchDelegate(bounds, mTutorialButton);

if (View.class.isInstance(mTutorialButton.getParent())) {
((View) mTutorialButton.getParent()).setTouchDelegate(touchDelegate);
}
}
});



That’s it. The actual bounds of your Rect might require some experimenting when used in an actual layout. Feel free to post remarks and questions.

I was recently asked about how to use a TouchDelegate. I was a bit
rusty myself on this and I couldn't find any good documentation on it.
Here's the code I wrote after a little trial and error.
touch_delegate_view is a simple RelativeLayout with the id
touch_delegate_root. I defined with a single, child of the layout, the
button delegated_button. In this example I expand the clickable area
of the button to 200 pixels above the top of my button.

public class TouchDelegateSample extends Activity {

Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.touch_delegate_view);
mButton = (Button)findViewById(R.id.delegated_button);
View parent = findViewById(R.id.touch_delegate_root);

// post a runnable to the parent view's message queue so its run
after
// the view is drawn
parent.post(new Runnable() {
@Override
public void run() {
Rect delegateArea = new Rect();
Button delegate = TouchDelegateSample.this.mButton;
delegate.getHitRect(delegateArea);
delegateArea.top -= 200;
TouchDelegate expandedArea = new TouchDelegate(delegateArea,
delegate);
// give the delegate to an ancestor of the view we're
delegating the
// area to
if (View.class.isInstance(delegate.getParent())) {
((View)delegate.getParent()).setTouchDelegate(expandedArea);
}
}
});
}

}

Cheers,
Justin
Android Team @ Google

更多相关文章

  1. 【转载】android仿QQ列表的效果实现
  2. Become a better android developer(转载)
  3. 本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI(转载)
  4. 转载一篇详细的分析:Android(安卓)View绘制和显示原理简介
  5. Android(安卓)Intent传递对象摘要
  6. android源码下载,从Android2.2.2到4.2.2的源码整理汇总
  7. 近百android程序源码贡献 转载的自己看的
  8. Android――ViewGroup的一个用法实例(转载)
  9. 利用html5开发android(转载)

随机推荐

  1. Android开发方式分析
  2. android 百度地图 定位获取位置失败 62错
  3. 找不到android系统库的解决方案
  4. Android仿微信底部按钮滑动变色
  5. Android(安卓)studio 解决各种错误
  6. Android Listener侦听的N种写法
  7. android Shader类简介_渲染图像
  8. 深入ListView
  9. Android(安卓)Eclipse 闪退问题
  10. 异常 报错 Android library projects can