맵 위에 그림을 그리려고 합니다
chat.java에서는 제 위치를 받아오고 웹뷰와 맵뷰로 나누어져 있고
MyPositionOverlay.java에서 draw를 하려고 하는데
지도위에 Here I am 이라는 텍스트와 동그라미는 표시가 되는데
터치로 그림은 그려지지 않습니다. 소스상에 에러는 없습니다.
일단 저 코드를 실행하면 터치가 되지 않습니다.
제 생각엔 이미 지도상에서 터치가 되고 있는데
제가 터치에 대한 함수를 구현해서 그런 것 같은데 그게 맞나요??
그게 맞다면 지도위의 터치를 disable시키는 방법이 있나요?
왜 터치 자체가 인식되지 않는지 모르겠습니다..
-chat.java
package com.Messenger;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.MenuItem.OnMenuItemClickListener;
import android.webkit.WebView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
public class Chat extends MapActivity {
MapController mapController;
MyPositionOverlay positionOverlay;
private WebView webView;
private static final int sMenuExampleResources[] = { R.menu.submenu_chat };
private static final String sMenuExampleNames[] = { "Submenu2" };
private Spinner mSpinner;
private TextView mInstructionsText;
private Menu mMenu;
int flag = 0;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.chat);
MapView myMapView = (MapView) findViewById(R.id.mapview);
mapController = myMapView.getController();
webView = (WebView) findViewById(R.id.web_view);
// webView.loadUrl("211.196.78.16:8100/msg.htm");
webView.loadUrl("http://www.naver.com");
// Configure the map display options
myMapView.setSatellite(true);
myMapView.setStreetView(true);
// Zoom in
mapController.setZoom(17);
// Add the MyPositionOverlay
positionOverlay = new MyPositionOverlay();
List<Overlay> overlays = myMapView.getOverlays();
overlays.add(positionOverlay);
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);
Location location = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);
locationManager.requestLocationUpdates(provider, 2000, 10,
locationListener);
// Create a simple layout
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
// Create the spinner to allow the user to choose a menu XML
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, sMenuExampleNames);
adapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner = new Spinner(this);
mSpinner.setAdapter(adapter);
}
private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
updateWithNewLocation(location);
}
public void onProviderDisabled(String provider) {
updateWithNewLocation(null);
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
/** Update the map with a new location */
private void updateWithNewLocation(Location location) {
// TextView myLocationText = (TextView)
// findViewById(R.id.myLocationText);
// String latLongString;
// String addressString = "No address found";
if (location != null) {
// Update my location marker
positionOverlay.setLocation(location);
// Update the map location.
Double geoLat = location.getLatitude() * 1E6;
Double geoLng = location.getLongitude() * 1E6;
GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());
mapController.animateTo(point);
double lat = location.getLatitude();
double lng = location.getLongitude();
// latLongString = "Lat:" + lat + "\nLong:" + lng;
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
List<Address> addresses = gc.getFromLocation(lat, lng, 1);
StringBuilder sb = new StringBuilder();
if (addresses.size() > 0) {
Address address = addresses.get(0);
for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
sb.append(address.getAddressLine(i)).append("\n");
sb.append(address.getLocality()).append("\n");
sb.append(address.getPostalCode()).append("\n");
sb.append(address.getCountryName());
}
// addressString = sb.toString();
} catch (IOException e) {
}
} else {
// latLongString = "No location found";
}
// myLocationText.setText("Your Current Position is:\n" + latLongString
// + "\n" + addressString);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Hold on to this
mMenu = menu;
// Inflate the currently selected menu XML resource.
MenuInflater inflater = getMenuInflater();
inflater.inflate(sMenuExampleResources[mSpinner
.getSelectedItemPosition()], menu);
// Disable the spinner since we've already created the menu and the user
// can no longer pick a different menu XML.
mSpinner.setEnabled(false);
// Change instructions
return true;
}
/*
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
MenuItem draw = mMenu.add(R.id.draw);
draw.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
flag = 1;
return true;
}
});
if(flag == 1)
startActivity(new Intent(this, Draw.class));
}
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.list:
startActivity(new Intent(this, List.class));
return true;
case R.id.map1:
startActivity(new Intent(this, Map1.class));
return true;
case R.id.map2:
startActivity(new Intent(this, map2.class));
return true;
case R.id.chat:
startActivity(new Intent(this, Chat.class));
return true;
case R.id.draw:
// if(flag == 1)
startActivity(new Intent(this, Draw.class));
return true;
default:
// Don't toast text when a submenu2 is clicked
if (!item.hasSubMenu()) {
Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT)
.show();
return true;
}
break;
}
return false;
}
}
- MyPostionOverlay.java
package com.Messenger;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.RectF;
import android.location.Location;
import android.view.MotionEvent;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
public class MyPositionOverlay extends Overlay {
Location location;
private final int mRadius = 5;
private float mX, mY;
private static final float TOUCH_TOLERANCE = 4;
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mBitmapPaint;
private Bitmap src;
private Paint mPaint;
/** Get the position location */
public Location getLocation() {
return location;
}
/** Set the position location */
public void setLocation(Location location) {
this.location = location;
}
private void touch_start(float x, float y) {
// System.out.println("onClick");
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;
}
private void touch_move(float x, float y) {
System.out.println("onClick");
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
mX = x;
mY = y;
}
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Projection projection = mapView.getProjection();
if (shadow == false) {
// Get the current location
Double latitude = location.getLatitude() * 1E6;
Double longitude = location.getLongitude() * 1E6;
GeoPoint geoPoint = new GeoPoint(latitude.intValue(), longitude
.intValue());
// Convert the location to screen pixels
Point point = new Point();
projection.toPixels(geoPoint, point);
RectF oval = new RectF(point.x - mRadius, point.y - mRadius,
point.x + mRadius, point.y + mRadius);
// Setup the paint
Paint paint = new Paint();
paint.setARGB(255, 255, 255, 255);
paint.setAntiAlias(true);
paint.setFakeBoldText(true);
Paint backPaint = new Paint();
backPaint.setARGB(180, 50, 50, 50);
backPaint.setAntiAlias(true);
RectF backRect = new RectF(point.x + 2 + mRadius, point.y - 3
* mRadius, point.x + 65, point.y + mRadius);
// Draw the marker
canvas.drawOval(oval, paint);
canvas.drawRoundRect(backRect, 5, 5, backPaint);
canvas.drawText("Here I Am", point.x + 2 * mRadius, point.y, paint);
// canvas.drawPath(mPath, mPaint);
}
super.draw(canvas, mapView, shadow);
}
private void touch_up() {
System.out.println("onClick");
mPath.lineTo(mX, mY);
// commit the path to our offscreen
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath.reset();
}
// @Override
public boolean onTouchEvent(android.view.MotionEvent event, MapView mapView) {
System.out.println("onClick");
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);
break;
case MotionEvent.ACTION_UP:
touch_up();
break;
}
return true;
}
@Override
public boolean onTap(GeoPoint point, MapView mapView) {
return false;
}
}
공지사항을 확인하였습니다.