- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 MapView
创建 Android 应用程序。我需要对用户的触摸事件使用react。我尝试使用 dispatchTouchEvent
在 onTouchEvent
中处理一些操作。但是这个 onTouchEvent
没有被调用!当我在 dispatchTouchEvent
中添加此代码时:
MarkerOverlay myMarker = new MarkerOverlay(marker,edTxtAlarmClockName.getText().toString());
mapView.getOverlays().add(myMarker);
mapView.invalidate();
onTouchEvent
被调用。为什么会这样以及如何描述 overlay
处理程序?
public class MainActivity extends MapActivity implements OnTouchListener{
private MapController mapController;
private MapView mapView;
private LocationManager locationManager;
private MyLocationOverlay myLocationOverlay;
private Context context;
public GeoPoint lastClickedPoint;
Dialog dialog;
EditText edTxtAlarmClockName;
ToggleButton tbOnOffAlarmClock;
boolean reClick ;
private int lastTouchX, lastTouchY;
private boolean hasMoved = false;
Button btnOk;
Button btnCancelDelete;
Button btnAlarmClockStop;
public int distance=50;
private int indexOfSelectedOverlay;
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
context = MainActivity.this;
// Configure the Map
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
mapView.setStreetView(true);
mapView.setSatellite(true);
mapView.setOnTouchListener(this);
mapController = mapView.getController();
mapController.setZoom(15);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 10, geoupdate);
myLocationOverlay = new MyLocationOverlay(this, mapView);
myLocationOverlay.disableCompass();
myLocationOverlay.enableMyLocation();
mapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.runOnFirstFix(new Runnable() {
public void run() {
mapView.getController().animateTo(myLocationOverlay.getMyLocation());
mapView.setBuiltInZoomControls(true);
}
});
final Drawable drawable = this.getResources().getDrawable(R.drawable.ic_launcher);
dialog = new Dialog(context);
dialog.setContentView(R.layout.custom1);
dialog.setTitle(R.string.str_new_alarm);
tbOnOffAlarmClock=(ToggleButton)dialog.findViewById(R.id.toggleButton1);
edTxtAlarmClockName = (EditText) dialog.findViewById(R.id.textView1);
edTxtAlarmClockName.setText(R.string.str_name);
btnOk = (Button) dialog.findViewById(R.id.btn_ok);
btnCancelDelete = (Button) dialog.findViewById(R.id.btn_cancel);
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MarkerOverlay myMarker;
if (reClick) //click on the overlay
{//search and rename
myMarker=(MarkerOverlay)mapView.getOverlays().get(indexOfSelectedOverlay);
mapView.getOverlays().remove(indexOfSelectedOverlay);
myMarker.setName(edTxtAlarmClockName.getText().toString());
mapView.getOverlays().add(myMarker);
mapView.invalidate();
}
else
{//creat overlay
myMarker = new MarkerOverlay(drawable,edTxtAlarmClockName.getText().toString());
myMarker.setName(edTxtAlarmClockName.getText().toString());
if (tbOnOffAlarmClock.isChecked()) {
myMarker.active=true;
} else {
myMarker.active=false;
}
mapView.getOverlays().add(myMarker);
mapView.invalidate();
}
dialog.dismiss();
}
});
btnCancelDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
OverlayItem item;
Point itemPoint,currentPoint;
MarkerOverlay myOverlay;
if (reClick) //delete marker
{
Log.d("debug","delete");
mapView.getOverlays().remove(indexOfSelectedOverlay);
mapView.invalidate();
}
//else CANCEL
dialog.dismiss();
}
});
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
@Override
protected void onDestroy() {
super.onDestroy();
locationManager.removeUpdates(geoupdate);
}
@Override
protected void onResume() {
super.onResume();
myLocationOverlay.enableMyLocation();
myLocationOverlay.enableCompass();
}
@Override
protected void onPause() {
super.onPause();
myLocationOverlay.disableMyLocation();
myLocationOverlay.disableCompass();
}
public class MarkerOverlay extends ItemizedOverlay<OverlayItem>
{
private Drawable marker = null;
private boolean active=true;
private GeoPoint pointOfOverlay;
private String customName;
public List<OverlayItem> items=new ArrayList<OverlayItem>();;
public MarkerOverlay(Drawable marker,String name)
{
super(boundCenterBottom(marker));
this.marker=marker;
OverlayItem item = new OverlayItem(lastClickedPoint, name,"");
this.pointOfOverlay=lastClickedPoint;
this.customName=name;
items.add(item);
populate();
}
public String getName()
{
return customName;
}
public void setName(String name)
{
customName=name;
}
public GeoPoint getPoint()
{
return pointOfOverlay;
}
@Override
protected OverlayItem createItem(int i)
{
return(items.get(i));
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow)
{
super.draw(canvas, mapView, shadow);
boundCenterBottom(marker);
}
@Override
public int size()
{
return(items.size());
}
@Override
public boolean onTouchEvent(MotionEvent motionEvent, MapView mapView) {
boolean consumed = super.onTouchEvent(motionEvent,mapView);
int action = motionEvent.getAction();
int size;
switch (action) {
case MotionEvent.ACTION_DOWN:
lastTouchX =(int) motionEvent.getX();
lastTouchY =(int) motionEvent.getY();
hasMoved = false;
break;
case MotionEvent.ACTION_MOVE:
hasMoved = moved(motionEvent);
break;
case MotionEvent.ACTION_UP:
if (!moved(motionEvent))
{
size = items.size();
if (size > 0)
{
OverlayItem item = items.get(size - 1);
Point p1 = mapView.getProjection().toPixels(item.getPoint(), null);
if (hitTest(item, marker, lastTouchX - p1.x, lastTouchY - p1.y))
{
dialog.setTitle(item.getTitle());
btnCancelDelete.setText(R.string.str_delete);
dialog.show();
reClick=true;
}
else
{
edTxtAlarmClockName.setText(R.string.str_name);
btnCancelDelete.setText(R.string.str_cancel);
dialog.show();
lastClickedPoint = mapView.getProjection().fromPixels((int) motionEvent.getX(), (int) motionEvent.getY());
reClick=false;
}
populate();
return true;
}
else
{
edTxtAlarmClockName.setText(R.string.str_name);
dialog.setTitle(R.string.str_new_alarm);
btnCancelDelete.setText(R.string.str_cancel);
dialog.show();
lastClickedPoint = mapView.getProjection().fromPixels((int) motionEvent.getX(), (int) motionEvent.getY());
reClick=false;
}
populate();
return true;
}
}
return false||consumed;
}
private boolean moved(MotionEvent evt) {
Log.d("debug", "ontouchevent move");
return hasMoved ||
Math.abs(evt.getX() - lastTouchX) > 20.0 ||
Math.abs(evt.getY() - lastTouchY) > 20.0;
}
}
@Override
public boolean onTouch (View v, MotionEvent event)
{
int action = event.getAction();
if (action == MotionEvent.ACTION_UP)
{
lastClickedPoint= mapView.getProjection().fromPixels( (int) event.getX(), (int) event.getY());
return true;
}
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent motionEvent) {
int action = motionEvent.getAction();
Drawable marker = getResources().getDrawable(R.drawable.ic_launcher);
switch(action) {
case MotionEvent.ACTION_UP:
MarkerOverlay myMarker = new MarkerOverlay(marker,edTxtAlarmClockName.getText().toString());
mapView.getOverlays().add(myMarker);
mapView.invalidate();
break;
}
return super.dispatchTouchEvent(motionEvent);
}
}
最佳答案
我觉得应该把onTouchEvents的过程加入on touch中,同时让MapView作为一个全局变量,然后在覆盖的onTOuch事件中调用Mapview变量。
据我所见,没有连接发起onTouchEvents
关于android - onTouchEvent 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12517205/
我有一个自定义布局捏缩放代码作为父布局和一个处理点击功能的子布局。因此我使用了触摸拦截,但问题是它不知道什么时候点击或拖动。 @Override public boolean onInter
我正在制作一个简单逻辑电路的单屏应用程序。我正在使用 onTouchEvent 来处理用户交互。我现在正在使用 ACTION_UP、ACTION_MOVE 和 ACTION_DOWN,但这只允许我使用
我为 Android 创建了一个非常简单的乒乓应用程序。 看起来不错,但我有一个问题: 我尝试执行 onScreenTouch 事件,以便将 Racket 放置在用户的触摸位置。 我的问题是 - 在哪
我目前正在开发我的第一个多点触控 Android 应用程序,但在使用 onTouchEvent() 时遇到了一些困难。我使用了在线教程中的一些代码,这似乎为我提供了屏幕上每次触摸的正确指针 ID 信息
以下:https://developer.android.com/training/gestures/movement.html 用于处理onTouchEvent中的移动。我的问题是,即使按照链接的教
除了public class MySurfaceView extends SurfaceView Implements SurfaceHolder.Callback之外,是否可以在类中创建 OnTou
我正在尝试创建一个子类来扩展和覆盖 onTouchEvent 方法。但是,我无法这样做,因为我不完全确定如何去做。 我可以将重写放在扩展 Activity 的公共(public)类中,还是必须是扩展
My full code here 我正在学习 Android 开发,并且正在尝试创建一个简单的单词搜索游戏。首先,我创建了一个 LetterTile 类,它代表屏幕上的一个字母,这个类有自己绘制的方
我有简单的 Activity : public class MainActivity extends Activity { @Override protected void onCre
我有一个 View v2 扩展了另一个 View v1。父 View v1 有一个 onTouchEvent,但我希望 subview v2 不使用 onTouchEvent。 我在 subview
我在 Android Dialog 中实现了按钮的 onLongClickListener,它使用计时器自动减少数字。这是代码 myIncreaseTimer = new Timer(); final
当我运行下面的代码时,一切正常,这是一个简单的应用程序,带有三个可以移动的球... public class dragndrop extends Activity { /** Called w
我正在使用 MapView 创建 Android 应用程序。我需要对用户的触摸事件使用react。我尝试使用 dispatchTouchEvent 在 onTouchEvent 中处理一些操作。但是这
我的第一个布局没有显示任何内容。它上面有一个显示图像的第二个布局。如何将 onTouchEvent 添加到第二个布局?(我问这个是因为 OnTouchEvent 只影响我的第一个布局......)它是
我正在开发 Android 2.1 API 7 应用。 在我的 Activity 中,我添加了 onTouchEvent() 回调来处理 screen touch 事件: public class M
谁能向我解释为什么 onTouchEvent 执行了两次,我怎样才能将它设置为只运行一次?我找不到解释。谢谢。 @Override public void onCreate(Bundle savedI
在我的应用程序中,我需要同时处理移动和点击事件。 点击是一个 ACTION_DOWN Action 、几个 ACTION_MOVE Action 和一个 ACTION_UP Action 的序列。理论
我正在尝试触摸应用程序的区域以在屏幕上放置一个“与”门。因此,当我触摸与门区域,然后再次触摸将其放置在电路上时,门会在我触摸的位置绘制,但一旦我再次触摸,它就会消失。 我使用canvas.drawBi
我有 GraphicView ,它扩展了 SurfaceView 。我需要它来绘制图形。我还需要 onTouchEvent。但问题是......我不知道如何描述它:)这是我的代码: public cl
我正在创建一个 Android 游戏,并且有一个像这样的 onTouchEvent : @Override public boolean onTouchEvent(MotionEvent event
我是一名优秀的程序员,十分优秀!