双击/点击地图缩放(Android)
可能重复:双击/点击地图缩放(Android),android,google-maps,Android,Google Maps,可能重复: 我有一个活动,它扩展了映射活动。我使用谷歌地图。 我需要双击或双击放大 有人能帮我吗 我已经看了下面的内容,但它们不是我想要的 我意识到,onTouchListener只被调用一次,为什么会这样 // set Gesture detector = new GestureDetector(new GestureReactor()); mapView.setOnTouchListener(new OnTouchListener() { @Override publi
我有一个
活动
,它扩展了映射活动
。我使用谷歌地图。我需要双击或双击放大 有人能帮我吗 我已经看了下面的内容,但它们不是我想要的 我意识到,
onTouchListener
只被调用一次,为什么会这样
// set Gesture
detector = new GestureDetector(new GestureReactor());
mapView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
System.out.println("Inside onTouch");
return detector.onTouchEvent(event);
}
});
我有私人课:
private class GestureReactor extends SimpleOnGestureListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
System.out.println("inside onDouble");
controller.zoomInFixing((int) e.getX(), (int) e.getY());
return super.onDoubleTap(e);
}
}
及
既然你想复制粘贴答案,看 编辑: 在我的
public类MainMap extends MapActivity
中,我有一个名为private MyMapView mv的字段代码>
然后我创建了一个类,它扩展了MapView
,如下所示:
公共类MyMapView扩展了MapView
因此,您只需创建一个新类,扩展MapView
,复制粘贴您在其中的链接中找到的代码,并在扩展MapActivity的活动中使用新的类
,此解决方案非常好我喜欢使用自定义视图扩展MapView并在整个应用程序中使用此解决方案。MapView有一个截取触摸手势的功能,您可以使用该功能进行双击巫毒。如果应用程序中有多个地图,这是保持干燥的好方法
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import com.google.android.maps.MapView;
public class MyMapView extends MapView {
private long lastTouchTime = -1;
public MyMapView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
long thisTime = System.currentTimeMillis();
if (thisTime - lastTouchTime < ViewConfiguration.getDoubleTapTimeout()) {
// Double tap
this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY());
lastTouchTime = -1;
} else {
// Too slow :)
lastTouchTime = thisTime;
}
}
return super.onInterceptTouchEvent(ev);
}
}
导入android.content.Context;
导入android.util.AttributeSet;
导入android.view.MotionEvent;
导入android.view.ViewConfiguration;
导入com.google.android.maps.MapView;
公共类MyMapView扩展了MapView{
私有长lastTouchTime=-1;
公共MyMapView(上下文、属性集属性){
超级(上下文,attrs);
}
@凌驾
公共布尔值onInterceptTouchEvent(MotionEvent ev){
if(ev.getAction()==MotionEvent.ACTION\u向下){
long ThistTime=System.currentTimeMillis();
if(ThistTime-lastTouchTime
从开始,我无法像其他许多人那样去工作,因为这不允许我投射mapView=(MyMapView)findViewById(R.id.mapView)代码>据说我得到的最佳解决方案基于以下答案:
myLocationOverlay=新建myLocationOverlay(此,地图视图);
MyItemizedOverlay itemizedOverlay=新建MyItemizedOverlay(){
private long systemTime=System.currentTimeMillis();
@凌驾
公共布尔onTouchEvent(MotionEvent事件,MapView MapView){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
if((System.currentTimeMillis()-systemTime)
我遇到了与bbodenmiller相同的问题,在我不得不转换到新制作的类之前,一切都很好。mapView=(MyMapView)findViewById(R.id.mapView);将始终抛出异常
解决方案是更改显示自定义MapView的XML布局。使用普通地图视图时,XML布局如下所示:
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="Hidden for obvious reasons"
/>
问题在于“com.google.android.maps.MapView”将视图定义为一个特定的MapView。您需要使用自定义的MapView来定义它。最后看起来更像这样
<?xml version="1.0" encoding="utf-8"?>
<jocquej.PackageName.MyMapView
...
/>
我也一直在寻找答案/示例,但没有找到有效的代码
最后,以下是对我有用的代码:
MyMapActivity.java
public class MyMapActivity extends MapActivity implements OnGestureListener,
OnDoubleTapListener{
private MapView mapView;
@Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView)findViewById(R.id.mapView);
}
@Override
public boolean onDoubleTap(MotionEvent e) {
int x = (int)e.getX(), y = (int)e.getY();;
Projection p = mapView.getProjection();
mapView.getController().animateTo(p.fromPixels(x, y));
mapView.getController().zoomIn();
return true;
}
//Here will be some autogenerated methods too
public class OnDoubleTap extends MapView {
private long lastTouchTime = -1;
public OnDoubleTap(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
long thisTime = System.currentTimeMillis();
if (thisTime - lastTouchTime < 250) {
// Double tap
this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY());
lastTouchTime = -1;
} else {
// Too slow
lastTouchTime = thisTime;
}
}
return super.onInterceptTouchEvent(ev);
}
}
OnDoubleTap.java
public class MyMapActivity extends MapActivity implements OnGestureListener,
OnDoubleTapListener{
private MapView mapView;
@Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView)findViewById(R.id.mapView);
}
@Override
public boolean onDoubleTap(MotionEvent e) {
int x = (int)e.getX(), y = (int)e.getY();;
Projection p = mapView.getProjection();
mapView.getController().animateTo(p.fromPixels(x, y));
mapView.getController().zoomIn();
return true;
}
//Here will be some autogenerated methods too
public class OnDoubleTap extends MapView {
private long lastTouchTime = -1;
public OnDoubleTap(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
long thisTime = System.currentTimeMillis();
if (thisTime - lastTouchTime < 250) {
// Double tap
this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY());
lastTouchTime = -1;
} else {
// Too slow
lastTouchTime = thisTime;
}
}
return super.onInterceptTouchEvent(ev);
}
}
公共类OnDoubleTap扩展了MapView{
私有长lastTouchTime=-1;
公共OnDoubleTap(上下文、属性集属性){
超级(上下文,attrs);
}
@凌驾
公共布尔值onInterceptTouchEvent(MotionEvent ev){
if(ev.getAction()==MotionEvent.ACTION\u向下){
long ThistTime=System.currentTimeMillis();
如果(这次-上次接触时间<250){
//双击
this.getController().zoomInFixing((int)ev.getX(),(int)ev.getY());
lastTouchTime=-1;
}否则{
//太慢
lastTouchTime=这次;
}
}
返回超级onInterceptTouchEvent(ev);
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<azizbekyan.andranik.map.OnDoubleTap
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="YOUR_API_KEY" />
</LinearLayout>
别忘了在这里用你的apiKey
替换android:apiKey
值,因为这些链接会满足你的要求。不,它们不会,它们会谈论onFling/*/使用onDoubleTap
而不是onFling
对程序员来说应该是一个非常容易的选择,对吧?试试看。是的,你是对的,我忘了我是一名程序员有一段时间了。首先,让我感谢你的帮助,其次,你是如何发现我在寻找复制粘贴代码的。第三,让我告诉你,在3.15小时的搜索和尝试之后,有一个小问题很好。还有其他建议吗?我的类是从MapActivity扩展而来的。@并查看编辑:-)非常感谢。这也很有帮助。断开的链接,朋友。“Posterous空间不再可用”链接断开,朋友。“Posterous空格不再可用”