我想实现一个活动,你看到的唯一的东西是一个大图像,可以水平和垂直滚动。在该图像的顶部我想显示按钮,可以点击并触发某些动作(如创建意图开始一项新活动。)
首先,我在考虑一个ScrollView,它有一个FrameLayout作为孩子。 FrameLayout可以将图像作为背景,并可以将按钮作为子项。因为我知道我的按钮的位置,我可以用绝对坐标放置它们。这是我的第一个代码:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:layout_width="1298px"
android:layout_height="945px"
android:background="@drawable/myimage">
<Button
android:id="@+id/mybutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="115px"
android:layout_y="128px"/>
</FrameLayout>
</ScrollView>
问题是,您只能垂直滚动ScrollView。 HorizontalScrollView无法解决问题,因为它只能向一个方向滚动。我能以某种方式混合它们吗?还有其他解决方案吗?
我在stackoverflow上发现了一些类似的线程,人们将图像放入WebView并获得免费的水平/垂直滚动(here)。或者有人将图像放在imageview中,并为imageview提供onTouchListener来处理滚动(here)。两种方式的问题是,无论哪种方式,我都不认为你可以把按钮放在图像的顶部,这是我需要做的。
如果有人帮助我,我将非常感激。
答案 0 :(得分:0)
使用(不赞成!!!)AbsoluteLayout并给它和onTouchListener解决了我的问题:
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:src="@drawable/myImage"
android:layout_width="1298px"
android:layout_height="945px"
android:layout_x="0px"
android:layout_y="0px" />
<Button
android:id="@+id/myButton"
android:text="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="50px"
android:layout_y="300px"
android:tag="1"/>
</AbsoluteLayout>
private float mx;
private float my;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
final Button button = (Button)findViewById(R.id.myButton);
button.setOnClickListener (new View.OnClickListener(){
// OnClickAction
});
final AbsoluteLayout switcherView = (AbsoluteLayout) this.findViewById(R.id.myLayout);
switcherView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent event) {
float curX, curY;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mx = event.getX();
my = event.getY();
break;
case MotionEvent.ACTION_MOVE:
curX = event.getX();
curY = event.getY();
switcherView.scrollBy((int) (mx - curX), (int) (my - curY));
mx = curX;
my = curY;
break;
case MotionEvent.ACTION_UP:
curX = event.getX();
curY = event.getY();
switcherView.scrollBy((int) (mx - curX), (int) (my - curY));
break;
}
return true;
}
});
}