fix point location layer
refactor place of swing ui git-svn-id: https://osmand.googlecode.com/svn/trunk@36 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
bbd56254ae
commit
f150ba9823
12 changed files with 488 additions and 463 deletions
|
@ -1,45 +1,13 @@
|
|||
package com.osmand;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.MenuBar;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import javax.swing.DefaultListCellRenderer;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JSplitPane;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.JTree;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import javax.swing.event.TreeSelectionEvent;
|
||||
import javax.swing.event.TreeSelectionListener;
|
||||
import javax.swing.event.UndoableEditEvent;
|
||||
import javax.swing.event.UndoableEditListener;
|
||||
import javax.swing.tree.DefaultMutableTreeNode;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
|
||||
|
@ -51,11 +19,8 @@ import com.osmand.data.Amenity;
|
|||
import com.osmand.data.City;
|
||||
import com.osmand.data.DataTileManager;
|
||||
import com.osmand.data.Region;
|
||||
import com.osmand.data.Street;
|
||||
import com.osmand.data.City.CityType;
|
||||
import com.osmand.osm.Entity;
|
||||
import com.osmand.osm.LatLon;
|
||||
import com.osmand.osm.MapUtils;
|
||||
import com.osmand.osm.Node;
|
||||
import com.osmand.osm.OSMSettings;
|
||||
import com.osmand.osm.Relation;
|
||||
|
@ -63,6 +28,7 @@ import com.osmand.osm.Way;
|
|||
import com.osmand.osm.OSMSettings.OSMTagKey;
|
||||
import com.osmand.osm.io.OSMStorageWriter;
|
||||
import com.osmand.osm.io.OsmBaseStorage;
|
||||
import com.osmand.swing.OsmExtractionUI;
|
||||
|
||||
|
||||
// TO implement
|
||||
|
@ -99,7 +65,7 @@ import com.osmand.osm.io.OsmBaseStorage;
|
|||
* 7. node, way - amenity=?
|
||||
*
|
||||
*/
|
||||
public class DataExtraction implements IMapLocationListener {
|
||||
public class DataExtraction {
|
||||
|
||||
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XMLStreamException {
|
||||
new DataExtraction().testReadingOsmFile();
|
||||
|
@ -216,10 +182,9 @@ public class DataExtraction implements IMapLocationListener {
|
|||
}
|
||||
}
|
||||
|
||||
DataTileManager<LatLon> amenitiesManager = new DataTileManager<LatLon>();
|
||||
|
||||
for(Amenity a: amenities){
|
||||
country.registerAmenity(a);
|
||||
amenitiesManager.registerObject(a.getNode().getLatitude(), a.getNode().getLongitude(), a.getNode().getLatLon());
|
||||
}
|
||||
|
||||
|
||||
|
@ -232,10 +197,10 @@ public class DataExtraction implements IMapLocationListener {
|
|||
}
|
||||
}
|
||||
}
|
||||
mapPanel.setPoints(amenitiesManager);
|
||||
|
||||
|
||||
runUI(country);
|
||||
OsmExtractionUI ui = new OsmExtractionUI(country);
|
||||
ui.runUI();
|
||||
|
||||
List<Long> interestedObjects = new ArrayList<Long>();
|
||||
// MapUtils.addIdsToList(places, interestedObjects);
|
||||
for(Amenity a : amenities){
|
||||
|
@ -263,268 +228,5 @@ public class DataExtraction implements IMapLocationListener {
|
|||
///////////////////////////////////////////
|
||||
// 2. Showing UI
|
||||
|
||||
protected City selectedCity;
|
||||
|
||||
private MapPanel mapPanel = new MapPanel(new File(DefaultLauncherConstants.pathToDirWithTiles));
|
||||
|
||||
private DefaultMutableTreeNode amenitiesTree;
|
||||
private JTree treePlaces;
|
||||
|
||||
public void runUI(final Region r){
|
||||
JFrame frame = new JFrame("Tree of choose");
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
DefaultMutableTreeNode root = new DataExtractionTreeNode(r.getName(), r);
|
||||
amenitiesTree = new DataExtractionTreeNode("Amenities", r);
|
||||
amenitiesTree.add(new DataExtractionTreeNode("closest", r));
|
||||
root.add(amenitiesTree);
|
||||
for(CityType t : CityType.values()){
|
||||
DefaultMutableTreeNode cityTree = new DataExtractionTreeNode(t.toString(), t);
|
||||
root.add(cityTree);
|
||||
for(City ct : r.getCitiesByType(t)){
|
||||
DefaultMutableTreeNode cityNodeTree = new DataExtractionTreeNode(ct.getName(), ct);
|
||||
cityTree.add(cityNodeTree);
|
||||
|
||||
for(Street str : ct.getStreets()){
|
||||
DefaultMutableTreeNode strTree = new DataExtractionTreeNode(str.getName(), str);
|
||||
cityNodeTree.add(strTree);
|
||||
for(Entity e : str.getBuildings()){
|
||||
DefaultMutableTreeNode building = new DataExtractionTreeNode(e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER), e);
|
||||
strTree.add(building);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
frame.addWindowListener(new ExitListener());
|
||||
Container content = frame.getContentPane();
|
||||
frame.setFocusable(true);
|
||||
|
||||
|
||||
treePlaces = new JTree(root);
|
||||
final JList jList = new JList();
|
||||
jList.setCellRenderer(new DefaultListCellRenderer(){
|
||||
private static final long serialVersionUID = 4661949460526837891L;
|
||||
|
||||
@Override
|
||||
public Component getListCellRendererComponent(JList list,
|
||||
Object value, int index, boolean isSelected,
|
||||
boolean cellHasFocus) {
|
||||
super.getListCellRendererComponent(list, value, index, isSelected,
|
||||
cellHasFocus);
|
||||
if(value instanceof City){
|
||||
setText(((City)value).getName());
|
||||
}
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
JSplitPane panelForTreeAndImage = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(treePlaces), mapPanel);
|
||||
panelForTreeAndImage.setResizeWeight(0.2);
|
||||
mapPanel.setFocusable(true);
|
||||
mapPanel.addMapLocationListener(this);
|
||||
|
||||
|
||||
|
||||
JSplitPane pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new JScrollPane(jList), panelForTreeAndImage);
|
||||
pane.setResizeWeight(0.2);
|
||||
content.add(pane, BorderLayout.CENTER);
|
||||
|
||||
final JLabel label = new JLabel();
|
||||
content.add(label, BorderLayout.SOUTH);
|
||||
|
||||
JPanel panel = new JPanel(new BorderLayout());
|
||||
final JTextField textField = new JTextField();
|
||||
final JButton button = new JButton();
|
||||
button.setText("Set town");
|
||||
|
||||
|
||||
panel.add(textField, BorderLayout.CENTER);
|
||||
panel.add(button, BorderLayout.WEST);
|
||||
|
||||
content.add(panel, BorderLayout.NORTH);
|
||||
|
||||
|
||||
updateListCities(r, textField.getText(), jList);
|
||||
textField.getDocument().addUndoableEditListener(new UndoableEditListener(){
|
||||
@Override
|
||||
public void undoableEditHappened(UndoableEditEvent e) {
|
||||
updateListCities(r, textField.getText(), jList);
|
||||
}
|
||||
});
|
||||
|
||||
button.addActionListener(new ActionListener(){
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
selectedCity = (City)jList.getSelectedValue();
|
||||
}
|
||||
});
|
||||
|
||||
jList.addListSelectionListener(new ListSelectionListener(){
|
||||
@Override
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
if(jList.getSelectedValue() != null){
|
||||
Node node = ((City)jList.getSelectedValue()).getNode();
|
||||
String text = "Lat : " + node.getLatitude() + " Lon " + node.getLongitude();
|
||||
if(selectedCity != null){
|
||||
text += " distance " + MapUtils.getDistance(selectedCity.getNode(), node);
|
||||
}
|
||||
label.setText(text);
|
||||
mapPanel.setLatLon(node.getLatitude(), node.getLongitude());
|
||||
} else {
|
||||
String text = selectedCity == null ? "" : selectedCity.getName();
|
||||
label.setText(text);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
treePlaces.addTreeSelectionListener(new TreeSelectionListener(){
|
||||
@Override
|
||||
public void valueChanged(TreeSelectionEvent e) {
|
||||
if (e.getPath() != null) {
|
||||
if (e.getPath().getLastPathComponent() instanceof DefaultMutableTreeNode) {
|
||||
Object o = ((DefaultMutableTreeNode) e.getPath().getLastPathComponent()).getUserObject();
|
||||
|
||||
if (o instanceof City) {
|
||||
City c = (City) o;
|
||||
mapPanel.setLatLon(c.getNode().getLatitude(), c.getNode().getLongitude());
|
||||
mapPanel.requestFocus();
|
||||
}
|
||||
|
||||
if (o instanceof Entity) {
|
||||
Entity c = (Entity) o;
|
||||
if (c instanceof Node) {
|
||||
mapPanel.setLatLon(((Node) c).getLatitude(), ((Node) c).getLongitude());
|
||||
// mapPanel.requestFocus();
|
||||
} else {
|
||||
DefaultMutableTreeNode n = (DefaultMutableTreeNode) e.getPath().getPathComponent(
|
||||
e.getPath().getPathCount() - 2);
|
||||
if (n.getUserObject() instanceof Street) {
|
||||
Street str = (Street) n.getUserObject();
|
||||
LatLon l = str.getLocationBuilding(c);
|
||||
mapPanel.setLatLon(l.getLatitude(), l.getLongitude());
|
||||
mapPanel.requestFocus();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
MenuBar bar = new MenuBar();
|
||||
bar.add(MapPanel.getMenuToChooseSource(mapPanel));
|
||||
frame.setMenuBar(bar);
|
||||
frame.setSize(1024, 768);
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void locationChanged(final double newLatitude, final double newLongitude, Object source){
|
||||
Region reg = (Region) amenitiesTree.getUserObject();
|
||||
List<Amenity> closestAmenities = reg.getClosestAmenities(newLatitude, newLongitude);
|
||||
Collections.sort(closestAmenities, new Comparator<Amenity>(){
|
||||
@Override
|
||||
public int compare(Amenity o1, Amenity o2) {
|
||||
return Double.compare(MapUtils.getDistance(o1.getNode(), newLatitude, newLongitude),
|
||||
MapUtils.getDistance(o2.getNode(), newLatitude, newLongitude));
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
Map<String, List<Amenity>> filter = new TreeMap<String, List<Amenity>>();
|
||||
for(Amenity n : closestAmenities){
|
||||
String type = n.getType().toString();
|
||||
if(!filter.containsKey(type)){
|
||||
filter.put(type, new ArrayList<Amenity>());
|
||||
}
|
||||
filter.get(type).add(n);
|
||||
}
|
||||
for(int i=1; i< amenitiesTree.getChildCount(); ){
|
||||
if(!filter.containsKey(((DefaultMutableTreeNode)amenitiesTree.getChildAt(i)).getUserObject())){
|
||||
amenitiesTree.remove(i);
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
((DefaultMutableTreeNode)amenitiesTree.getChildAt(0)).removeAllChildren();
|
||||
|
||||
|
||||
for(int i=0; i<15 && i < closestAmenities.size(); i++){
|
||||
Amenity n = closestAmenities.get(i);
|
||||
int dist = (int) (MapUtils.getDistance(n.getNode(), newLatitude, newLongitude));
|
||||
String str = n.getSimpleFormat() + " [" +dist+" m ]";
|
||||
((DefaultMutableTreeNode)amenitiesTree.getChildAt(0)).add(
|
||||
new DataExtractionTreeNode(str, n));
|
||||
}
|
||||
|
||||
for(String s : filter.keySet()){
|
||||
DefaultMutableTreeNode p = null;
|
||||
for(int i=0; i< amenitiesTree.getChildCount(); i++){
|
||||
if(s.equals(((DefaultMutableTreeNode)amenitiesTree.getChildAt(i)).getUserObject())){
|
||||
p = ((DefaultMutableTreeNode)amenitiesTree.getChildAt(i));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (p == null) {
|
||||
p = new DefaultMutableTreeNode(s);
|
||||
}
|
||||
|
||||
p.removeAllChildren();
|
||||
for (Amenity n : filter.get(s)) {
|
||||
int dist = (int) (MapUtils.getDistance(n.getNode(), newLatitude, newLongitude));
|
||||
String str = n.getSimpleFormat() + " [" + dist + " m ]";
|
||||
DataExtractionTreeNode node = new DataExtractionTreeNode(str, n);
|
||||
p.add(node);
|
||||
}
|
||||
amenitiesTree.add(p);
|
||||
}
|
||||
treePlaces.updateUI();
|
||||
}
|
||||
|
||||
public void updateListCities(Region r, String text, JList jList){
|
||||
Collection<City> city = r.getSuggestedCities(text, 100);
|
||||
City[] names = new City[city.size()];
|
||||
int i=0;
|
||||
for(City c : city){
|
||||
names[i++] = c;
|
||||
}
|
||||
jList.setListData(names);
|
||||
}
|
||||
|
||||
|
||||
public static class DataExtractionTreeNode extends DefaultMutableTreeNode {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private String name;
|
||||
|
||||
public DataExtractionTreeNode(String name, Object userObject){
|
||||
super(userObject);
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return name;
|
||||
}
|
||||
|
||||
}
|
||||
public static class ExitListener extends WindowAdapter {
|
||||
public void windowClosing(WindowEvent event) {
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -22,13 +22,22 @@ public class ToDoConstants {
|
|||
public int EXTRACT_COMMON_PARTS_FROM_MAPPANEL_AND_OSMMAPVIEW = 5;
|
||||
|
||||
|
||||
public int REVISE_MAP_ACTIVITY_HOLD_ALL_ZOOM_LATLON_IN_ONEPLACE = 6;
|
||||
|
||||
|
||||
/**
|
||||
* Write activity to show something about authors / donation ....
|
||||
*/
|
||||
public int DESCRIBE_ABOUT_AUTHORS = 8;
|
||||
|
||||
// TODO see all calculations x, y for layers & for MapView
|
||||
|
||||
//// TODO for releasing version
|
||||
// 1. POI SEARCH NEAR TO YOU
|
||||
// 2. FIX BACK TO your location & gps & point of view (may be compass)
|
||||
// 3. Save settings between session
|
||||
// 4. Revise UI icons/layout
|
||||
// 5. Fix Java Spring to prepare your data!!! (add progress, import/export data)
|
||||
// 6. Enable city/streets/buildings index
|
||||
// 7. Search for city/streets/buildings!
|
||||
// -------------------
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -38,6 +38,14 @@ public class DataTileManager<T> {
|
|||
}
|
||||
}
|
||||
|
||||
public List<T> getAllObjects(){
|
||||
List<T> l = new ArrayList<T>();
|
||||
for(String s : objects.keySet()){
|
||||
l.addAll(objects.get(s));
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
public List<T> getObjects(double latitudeUp, double longitudeUp, double latitudeDown, double longitudeDown) {
|
||||
int tileXUp = (int) MapUtils.getTileNumberX(zoom, longitudeUp);
|
||||
int tileYUp = (int) MapUtils.getTileNumberY(zoom, latitudeUp);
|
||||
|
@ -72,7 +80,7 @@ public class DataTileManager<T> {
|
|||
// go through circle
|
||||
for (int i = 1; i <= depth; i++) {
|
||||
|
||||
// goes à
|
||||
// goes <EFBFBD>
|
||||
for (int j = 0; j <= i; j++) {
|
||||
// left & right
|
||||
int dx = j == 0 ? 0 : -1;
|
||||
|
@ -112,37 +120,5 @@ public class DataTileManager<T> {
|
|||
}
|
||||
|
||||
|
||||
|
||||
// testing way to search
|
||||
public static void print(int x, int y){
|
||||
System.out.println(x + (y-1)*5);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
int tileX = 3;
|
||||
int tileY = 3;
|
||||
int depth = 3;
|
||||
for(int i=1; i<=depth; i++){
|
||||
|
||||
// goes à
|
||||
for(int j=0; j<=i; j++){
|
||||
// left & right
|
||||
int dx = j==0 ? 0 : -1;
|
||||
for(; dx < 1 || (j < i && dx == 1); dx +=2){
|
||||
// north
|
||||
print(tileX + dx * j, tileY + i);
|
||||
// east
|
||||
print(tileX + i, tileY - dx *j);
|
||||
// south
|
||||
print(tileX - dx * j, tileY - i);
|
||||
// west
|
||||
print(tileX - i, tileY + dx *j);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -91,6 +91,10 @@ public class Region {
|
|||
return amenities.getClosestObjects(latitude, longitude, 2);
|
||||
}
|
||||
|
||||
public DataTileManager<Amenity> getAmenityManager(){
|
||||
return amenities;
|
||||
}
|
||||
|
||||
public void registerAmenity(Amenity a){
|
||||
amenities.registerObject(a.getNode().getLatitude(), a.getNode().getLongitude(), a);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package com.osmand;
|
||||
package com.osmand.swing;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
|
@ -33,7 +33,10 @@ import javax.swing.UIManager;
|
|||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
||||
import com.osmand.DataExtraction.ExitListener;
|
||||
import com.osmand.DefaultLauncherConstants;
|
||||
import com.osmand.IMapLocationListener;
|
||||
import com.osmand.LogUtil;
|
||||
import com.osmand.MapTileDownloader;
|
||||
import com.osmand.MapTileDownloader.DownloadRequest;
|
||||
import com.osmand.MapTileDownloader.IMapDownloaderCallback;
|
||||
import com.osmand.data.DataTileManager;
|
||||
|
@ -77,7 +80,7 @@ public class MapPanel extends JPanel implements IMapDownloaderCallback {
|
|||
}
|
||||
|
||||
|
||||
frame.addWindowListener(new ExitListener());
|
||||
frame.addWindowListener(new OsmExtractionUI.ExitListener());
|
||||
Container content = frame.getContentPane();
|
||||
|
||||
MapPanel panel = new MapPanel(new File(DefaultLauncherConstants.pathToDirWithTiles));
|
331
DataExtractionOSM/src/com/osmand/swing/OsmExtractionUI.java
Normal file
331
DataExtractionOSM/src/com/osmand/swing/OsmExtractionUI.java
Normal file
|
@ -0,0 +1,331 @@
|
|||
package com.osmand.swing;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.MenuBar;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import javax.swing.DefaultListCellRenderer;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JSplitPane;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.JTree;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import javax.swing.event.TreeSelectionEvent;
|
||||
import javax.swing.event.TreeSelectionListener;
|
||||
import javax.swing.event.UndoableEditEvent;
|
||||
import javax.swing.event.UndoableEditListener;
|
||||
import javax.swing.tree.DefaultMutableTreeNode;
|
||||
|
||||
import com.osmand.DefaultLauncherConstants;
|
||||
import com.osmand.IMapLocationListener;
|
||||
import com.osmand.data.Amenity;
|
||||
import com.osmand.data.City;
|
||||
import com.osmand.data.DataTileManager;
|
||||
import com.osmand.data.Region;
|
||||
import com.osmand.data.Street;
|
||||
import com.osmand.data.City.CityType;
|
||||
import com.osmand.osm.Entity;
|
||||
import com.osmand.osm.LatLon;
|
||||
import com.osmand.osm.MapUtils;
|
||||
import com.osmand.osm.Node;
|
||||
import com.osmand.osm.OSMSettings.OSMTagKey;
|
||||
|
||||
public class OsmExtractionUI implements IMapLocationListener {
|
||||
protected City selectedCity;
|
||||
|
||||
private MapPanel mapPanel = new MapPanel(new File(DefaultLauncherConstants.pathToDirWithTiles));
|
||||
|
||||
private DefaultMutableTreeNode amenitiesTree;
|
||||
private JTree treePlaces;
|
||||
|
||||
private final Region r;
|
||||
|
||||
public OsmExtractionUI(final Region r){
|
||||
this.r = r;
|
||||
}
|
||||
|
||||
|
||||
public void runUI(){
|
||||
JFrame frame = new JFrame("Tree of choose");
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
DefaultMutableTreeNode root = new DataExtractionTreeNode(r.getName(), r);
|
||||
amenitiesTree = new DataExtractionTreeNode("Amenities", r);
|
||||
amenitiesTree.add(new DataExtractionTreeNode("closest", r));
|
||||
root.add(amenitiesTree);
|
||||
for(CityType t : CityType.values()){
|
||||
DefaultMutableTreeNode cityTree = new DataExtractionTreeNode(t.toString(), t);
|
||||
root.add(cityTree);
|
||||
for(City ct : r.getCitiesByType(t)){
|
||||
DefaultMutableTreeNode cityNodeTree = new DataExtractionTreeNode(ct.getName(), ct);
|
||||
cityTree.add(cityNodeTree);
|
||||
|
||||
for(Street str : ct.getStreets()){
|
||||
DefaultMutableTreeNode strTree = new DataExtractionTreeNode(str.getName(), str);
|
||||
cityNodeTree.add(strTree);
|
||||
for(Entity e : str.getBuildings()){
|
||||
DefaultMutableTreeNode building = new DataExtractionTreeNode(e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER), e);
|
||||
strTree.add(building);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
frame.addWindowListener(new ExitListener());
|
||||
Container content = frame.getContentPane();
|
||||
frame.setFocusable(true);
|
||||
|
||||
|
||||
treePlaces = new JTree(root);
|
||||
final JList jList = new JList();
|
||||
jList.setCellRenderer(new DefaultListCellRenderer(){
|
||||
private static final long serialVersionUID = 4661949460526837891L;
|
||||
|
||||
@Override
|
||||
public Component getListCellRendererComponent(JList list,
|
||||
Object value, int index, boolean isSelected,
|
||||
boolean cellHasFocus) {
|
||||
super.getListCellRendererComponent(list, value, index, isSelected,
|
||||
cellHasFocus);
|
||||
if(value instanceof City){
|
||||
setText(((City)value).getName());
|
||||
}
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
JSplitPane panelForTreeAndImage = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(treePlaces), mapPanel);
|
||||
panelForTreeAndImage.setResizeWeight(0.2);
|
||||
mapPanel.setFocusable(true);
|
||||
mapPanel.addMapLocationListener(this);
|
||||
|
||||
|
||||
DataTileManager<LatLon> amenitiesManager = new DataTileManager<LatLon>();
|
||||
for(Amenity a : r.getAmenityManager().getAllObjects()){
|
||||
amenitiesManager.registerObject(a.getNode().getLatitude(), a.getNode().getLongitude(), a.getNode().getLatLon());
|
||||
}
|
||||
mapPanel.setPoints(amenitiesManager);
|
||||
|
||||
|
||||
JSplitPane pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new JScrollPane(jList), panelForTreeAndImage);
|
||||
pane.setResizeWeight(0.2);
|
||||
content.add(pane, BorderLayout.CENTER);
|
||||
|
||||
final JLabel label = new JLabel();
|
||||
content.add(label, BorderLayout.SOUTH);
|
||||
|
||||
JPanel panel = new JPanel(new BorderLayout());
|
||||
final JTextField textField = new JTextField();
|
||||
final JButton button = new JButton();
|
||||
button.setText("Set town");
|
||||
|
||||
|
||||
panel.add(textField, BorderLayout.CENTER);
|
||||
panel.add(button, BorderLayout.WEST);
|
||||
|
||||
content.add(panel, BorderLayout.NORTH);
|
||||
|
||||
|
||||
updateListCities(r, textField.getText(), jList);
|
||||
textField.getDocument().addUndoableEditListener(new UndoableEditListener(){
|
||||
@Override
|
||||
public void undoableEditHappened(UndoableEditEvent e) {
|
||||
updateListCities(r, textField.getText(), jList);
|
||||
}
|
||||
});
|
||||
|
||||
button.addActionListener(new ActionListener(){
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
selectedCity = (City)jList.getSelectedValue();
|
||||
}
|
||||
});
|
||||
|
||||
jList.addListSelectionListener(new ListSelectionListener(){
|
||||
@Override
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
if(jList.getSelectedValue() != null){
|
||||
Node node = ((City)jList.getSelectedValue()).getNode();
|
||||
String text = "Lat : " + node.getLatitude() + " Lon " + node.getLongitude();
|
||||
if(selectedCity != null){
|
||||
text += " distance " + MapUtils.getDistance(selectedCity.getNode(), node);
|
||||
}
|
||||
label.setText(text);
|
||||
mapPanel.setLatLon(node.getLatitude(), node.getLongitude());
|
||||
} else {
|
||||
String text = selectedCity == null ? "" : selectedCity.getName();
|
||||
label.setText(text);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
treePlaces.addTreeSelectionListener(new TreeSelectionListener(){
|
||||
@Override
|
||||
public void valueChanged(TreeSelectionEvent e) {
|
||||
if (e.getPath() != null) {
|
||||
if (e.getPath().getLastPathComponent() instanceof DefaultMutableTreeNode) {
|
||||
Object o = ((DefaultMutableTreeNode) e.getPath().getLastPathComponent()).getUserObject();
|
||||
|
||||
if (o instanceof City) {
|
||||
City c = (City) o;
|
||||
mapPanel.setLatLon(c.getNode().getLatitude(), c.getNode().getLongitude());
|
||||
mapPanel.requestFocus();
|
||||
}
|
||||
|
||||
if (o instanceof Entity) {
|
||||
Entity c = (Entity) o;
|
||||
if (c instanceof Node) {
|
||||
mapPanel.setLatLon(((Node) c).getLatitude(), ((Node) c).getLongitude());
|
||||
// mapPanel.requestFocus();
|
||||
} else {
|
||||
DefaultMutableTreeNode n = (DefaultMutableTreeNode) e.getPath().getPathComponent(
|
||||
e.getPath().getPathCount() - 2);
|
||||
if (n.getUserObject() instanceof Street) {
|
||||
Street str = (Street) n.getUserObject();
|
||||
LatLon l = str.getLocationBuilding(c);
|
||||
mapPanel.setLatLon(l.getLatitude(), l.getLongitude());
|
||||
mapPanel.requestFocus();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
MenuBar bar = new MenuBar();
|
||||
bar.add(MapPanel.getMenuToChooseSource(mapPanel));
|
||||
frame.setMenuBar(bar);
|
||||
frame.setSize(1024, 768);
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void locationChanged(final double newLatitude, final double newLongitude, Object source){
|
||||
Region reg = (Region) amenitiesTree.getUserObject();
|
||||
List<Amenity> closestAmenities = reg.getClosestAmenities(newLatitude, newLongitude);
|
||||
Collections.sort(closestAmenities, new Comparator<Amenity>(){
|
||||
@Override
|
||||
public int compare(Amenity o1, Amenity o2) {
|
||||
return Double.compare(MapUtils.getDistance(o1.getNode(), newLatitude, newLongitude),
|
||||
MapUtils.getDistance(o2.getNode(), newLatitude, newLongitude));
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
Map<String, List<Amenity>> filter = new TreeMap<String, List<Amenity>>();
|
||||
for(Amenity n : closestAmenities){
|
||||
String type = n.getType().toString();
|
||||
if(!filter.containsKey(type)){
|
||||
filter.put(type, new ArrayList<Amenity>());
|
||||
}
|
||||
filter.get(type).add(n);
|
||||
}
|
||||
for(int i=1; i< amenitiesTree.getChildCount(); ){
|
||||
if(!filter.containsKey(((DefaultMutableTreeNode)amenitiesTree.getChildAt(i)).getUserObject())){
|
||||
amenitiesTree.remove(i);
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
((DefaultMutableTreeNode)amenitiesTree.getChildAt(0)).removeAllChildren();
|
||||
|
||||
|
||||
for(int i=0; i<15 && i < closestAmenities.size(); i++){
|
||||
Amenity n = closestAmenities.get(i);
|
||||
int dist = (int) (MapUtils.getDistance(n.getNode(), newLatitude, newLongitude));
|
||||
String str = n.getSimpleFormat() + " [" +dist+" m ]";
|
||||
((DefaultMutableTreeNode)amenitiesTree.getChildAt(0)).add(
|
||||
new DataExtractionTreeNode(str, n));
|
||||
}
|
||||
|
||||
for(String s : filter.keySet()){
|
||||
DefaultMutableTreeNode p = null;
|
||||
for(int i=0; i< amenitiesTree.getChildCount(); i++){
|
||||
if(s.equals(((DefaultMutableTreeNode)amenitiesTree.getChildAt(i)).getUserObject())){
|
||||
p = ((DefaultMutableTreeNode)amenitiesTree.getChildAt(i));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (p == null) {
|
||||
p = new DefaultMutableTreeNode(s);
|
||||
}
|
||||
|
||||
p.removeAllChildren();
|
||||
for (Amenity n : filter.get(s)) {
|
||||
int dist = (int) (MapUtils.getDistance(n.getNode(), newLatitude, newLongitude));
|
||||
String str = n.getSimpleFormat() + " [" + dist + " m ]";
|
||||
DataExtractionTreeNode node = new DataExtractionTreeNode(str, n);
|
||||
p.add(node);
|
||||
}
|
||||
amenitiesTree.add(p);
|
||||
}
|
||||
treePlaces.updateUI();
|
||||
}
|
||||
|
||||
public void updateListCities(Region r, String text, JList jList){
|
||||
Collection<City> city = r.getSuggestedCities(text, 100);
|
||||
City[] names = new City[city.size()];
|
||||
int i=0;
|
||||
for(City c : city){
|
||||
names[i++] = c;
|
||||
}
|
||||
jList.setListData(names);
|
||||
}
|
||||
|
||||
|
||||
public static class DataExtractionTreeNode extends DefaultMutableTreeNode {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private String name;
|
||||
|
||||
public DataExtractionTreeNode(String name, Object userObject){
|
||||
super(userObject);
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return name;
|
||||
}
|
||||
|
||||
}
|
||||
public static class ExitListener extends WindowAdapter {
|
||||
public void windowClosing(WindowEvent event) {
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry excluding="**/DataExtraction*|**/MapPanel*|com/osmand/osm/io/OSMStorageWriter.java|com/osmand/LogUtil.java" kind="src" path="use"/>
|
||||
<classpathentry excluding="**/MapPanel*|com/osmand/LogUtil.java|com/osmand/osm/io/OSMStorageWriter.java|com/osmand/DataExtraction.java|com/osmand/swing/" kind="src" path="use"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry kind="lib" path="lib/bzip2-20090327.jar"/>
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent">
|
||||
<com.osmand.views.OsmandMapTileView android:id="@+id/MapView" android:layout_width="fill_parent" android:layout_height="fill_parent"></com.osmand.views.OsmandMapTileView>
|
||||
<com.osmand.views.PointOfView android:id="@+id/PointOfView" android:layout_width="fill_parent" android:layout_height="fill_parent"></com.osmand.views.PointOfView>
|
||||
|
||||
<ZoomControls android:id="@+id/ZoomControls01"
|
||||
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right"></ZoomControls>
|
||||
|
|
|
@ -163,7 +163,7 @@ public class ResourceManager {
|
|||
onLowMemory();
|
||||
}
|
||||
|
||||
if (!downloader.isFileCurrentlyDownloaded(en)) {
|
||||
if (!downloader.isFileCurrentlyDownloaded(en) && req.dirWithTiles.canRead()) {
|
||||
if (en.exists()) {
|
||||
long time = System.currentTimeMillis();
|
||||
cacheOfImages.put(req.fileToLoad, BitmapFactory.decodeFile(en.getAbsolutePath()));
|
||||
|
|
|
@ -22,10 +22,9 @@ import com.osmand.IMapLocationListener;
|
|||
import com.osmand.OsmandSettings;
|
||||
import com.osmand.R;
|
||||
import com.osmand.ResourceManager;
|
||||
import com.osmand.osm.MapUtils;
|
||||
import com.osmand.views.OsmandMapTileView;
|
||||
import com.osmand.views.POIMapLayer;
|
||||
import com.osmand.views.PointOfView;
|
||||
import com.osmand.views.PointLocationLayer;
|
||||
|
||||
public class MapActivity extends Activity implements LocationListener, IMapLocationListener {
|
||||
/** Called when the activity is first created. */
|
||||
|
@ -39,7 +38,7 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
|
||||
private ImageButton backToMenu;
|
||||
|
||||
private PointOfView pointOfView;
|
||||
private PointLocationLayer locationLayer;
|
||||
|
||||
private POIMapLayer poiMapLayer;
|
||||
|
||||
|
@ -58,6 +57,8 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
poiMapLayer = new POIMapLayer();
|
||||
poiMapLayer.setNodeManager(ResourceManager.getResourceManager().getPoiIndex());
|
||||
mapView.addLayer(poiMapLayer);
|
||||
locationLayer = new PointLocationLayer();
|
||||
mapView.addLayer(locationLayer);
|
||||
|
||||
|
||||
ZoomControls zoomControls = (ZoomControls) findViewById(R.id.ZoomControls01);
|
||||
|
@ -74,8 +75,6 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
}
|
||||
});
|
||||
|
||||
pointOfView = (PointOfView)findViewById(R.id.PointOfView);
|
||||
|
||||
backToLocation = (ImageButton)findViewById(R.id.BackToLocation);
|
||||
backToLocation.setVisibility(linkLocationWithMap ? View.INVISIBLE : View.VISIBLE);
|
||||
backToLocation.setOnClickListener(new OnClickListener(){
|
||||
|
@ -104,10 +103,6 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
|
||||
});
|
||||
|
||||
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
|
||||
service.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -118,8 +113,9 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
lastKnownLocation = location;
|
||||
if(linkLocationWithMap){
|
||||
mapView.setLatLon(location.getLatitude(), location.getLongitude());
|
||||
}
|
||||
validatePointOfView();
|
||||
locationLayer.setLastKnownLocation(lastKnownLocation);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -137,32 +133,6 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
// TODO when provider disabled reset lastKnownLocation!
|
||||
}
|
||||
|
||||
public void validatePointOfView(){
|
||||
if(lastKnownLocation == null){
|
||||
if(pointOfView.isVisible()){
|
||||
pointOfView.setLocationX(-1);
|
||||
pointOfView.setLocationY(-1);
|
||||
pointOfView.setAreaRadius(0);
|
||||
pointOfView.invalidate();
|
||||
}
|
||||
} else {
|
||||
int newX = MapUtils.getPixelShiftX(mapView.getZoom(),
|
||||
lastKnownLocation.getLongitude(), mapView.getLongitude(), mapView.getTileSize()) +
|
||||
mapView.getWidth()/2;
|
||||
int newY = MapUtils.getPixelShiftY(mapView.getZoom(),
|
||||
lastKnownLocation.getLatitude(), mapView.getLatitude() , mapView.getTileSize()) +
|
||||
mapView.getHeight()/2;
|
||||
// TODO specify bearing!
|
||||
int radius = MapUtils.getLengthXFromMeters(mapView.getZoom(), mapView.getLatitude(), mapView.getLongitude(),
|
||||
lastKnownLocation.getAccuracy(), mapView.getTileSize(), mapView.getWidth());
|
||||
|
||||
pointOfView.setLocationX(newX);
|
||||
pointOfView.setLocationY(newY);
|
||||
pointOfView.setAreaRadius(radius);
|
||||
pointOfView.invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
// TODO Auto-generated method stub
|
||||
|
@ -172,6 +142,8 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
|
||||
service.removeUpdates(this);
|
||||
// TODO switch off gps
|
||||
super.onPause();
|
||||
}
|
||||
|
@ -190,6 +162,8 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
mapView.removeLayer(poiMapLayer);
|
||||
}
|
||||
}
|
||||
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
|
||||
service.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, this);
|
||||
}
|
||||
|
||||
|
||||
|
@ -208,7 +182,6 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
|||
linkLocationWithMap = false;
|
||||
backToLocation.setVisibility(View.VISIBLE);
|
||||
}
|
||||
validatePointOfView();
|
||||
}
|
||||
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
|
|
107
OsmAnd/src/com/osmand/views/PointLocationLayer.java
Normal file
107
OsmAnd/src/com/osmand/views/PointLocationLayer.java
Normal file
|
@ -0,0 +1,107 @@
|
|||
package com.osmand.views;
|
||||
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.location.Location;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
import com.osmand.osm.MapUtils;
|
||||
|
||||
public class PointLocationLayer implements OsmandMapLayer {
|
||||
private Paint location;
|
||||
private Paint area;
|
||||
|
||||
protected Location lastKnownLocation = null;
|
||||
private OsmandMapTileView view;
|
||||
|
||||
private void initUI() {
|
||||
location = new Paint();
|
||||
location.setColor(Color.BLUE);
|
||||
location.setAlpha(150);
|
||||
location.setAntiAlias(true);
|
||||
|
||||
area = new Paint();
|
||||
area.setColor(Color.BLUE);
|
||||
area.setAlpha(40);
|
||||
}
|
||||
|
||||
public void initLayer(OsmandMapTileView view) {
|
||||
this.view = view;
|
||||
initUI();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDraw(Canvas canvas) {
|
||||
if (isLocationVisible(lastKnownLocation)) {
|
||||
int locationX = MapUtils.getPixelShiftX(view.getZoom(), lastKnownLocation.getLongitude(), view.getLongitude(), view
|
||||
.getTileSize())
|
||||
+ view.getWidth() / 2;
|
||||
int locationY = MapUtils
|
||||
.getPixelShiftY(view.getZoom(), lastKnownLocation.getLatitude(), view.getLatitude(), view.getTileSize())
|
||||
+ view.getHeight() / 2;
|
||||
// TODO specify bearing!
|
||||
int radius = MapUtils.getLengthXFromMeters(view.getZoom(), view.getLatitude(), view.getLongitude(), lastKnownLocation
|
||||
.getAccuracy(), view.getTileSize(), view.getWidth());
|
||||
|
||||
if (locationX >= 0 && locationY >= 0) {
|
||||
canvas.drawCircle(locationX, locationY, 4, location);
|
||||
}
|
||||
if (radius > 4) {
|
||||
canvas.drawCircle(locationX, locationY, radius, area);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocationVisible(Location l){
|
||||
if(l == null || view == null){
|
||||
return false;
|
||||
}
|
||||
int newX = MapUtils.getPixelShiftX(view.getZoom(),
|
||||
l.getLongitude(), view.getLongitude(), view.getTileSize()) +
|
||||
view.getWidth()/2;
|
||||
int newY = MapUtils.getPixelShiftY(view.getZoom(),
|
||||
l.getLatitude(), view.getLatitude() , view.getTileSize()) +
|
||||
view.getHeight()/2;
|
||||
int radius = MapUtils.getLengthXFromMeters(view.getZoom(), view.getLatitude(), view.getLongitude(),
|
||||
l.getAccuracy(), view.getTileSize(), view.getWidth());
|
||||
if(newX >= 0 && newX <= view.getWidth() && newY >=0 && newY <= view.getHeight()){
|
||||
return true;
|
||||
} else {
|
||||
// check radius (simplified version
|
||||
if (newX + radius >= 0 && newX - radius <= view.getWidth() && newY + radius >= 0 && newY - radius <= view.getHeight()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public Location getLastKnownLocation() {
|
||||
return lastKnownLocation;
|
||||
}
|
||||
|
||||
public void setLastKnownLocation(Location lastKnownLocation) {
|
||||
boolean redraw = isLocationVisible(this.lastKnownLocation) || isLocationVisible(lastKnownLocation);
|
||||
this.lastKnownLocation = lastKnownLocation;
|
||||
if(redraw){
|
||||
view.prepareImage();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyLayer() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -1,79 +0,0 @@
|
|||
package com.osmand.views;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
|
||||
public class PointOfView extends View {
|
||||
private Paint location;
|
||||
private Paint area;
|
||||
|
||||
|
||||
private int areaRadius = 0;
|
||||
private int locationX = -1;
|
||||
private int locationY = -1;
|
||||
|
||||
public PointOfView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
initUI();
|
||||
}
|
||||
|
||||
public PointOfView(Context context) {
|
||||
super(context);
|
||||
initUI();
|
||||
}
|
||||
|
||||
private void initUI() {
|
||||
location = new Paint();
|
||||
location.setColor(Color.BLUE);
|
||||
location.setAlpha(150);
|
||||
location.setAntiAlias(true);
|
||||
|
||||
area = new Paint();
|
||||
area.setColor(Color.BLUE);
|
||||
area.setAlpha(40);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
if(locationX >= 0 && locationY >=0){
|
||||
canvas.drawCircle(locationX, locationY, 4, location);
|
||||
}
|
||||
if(areaRadius > 4){
|
||||
canvas.drawCircle(locationX, locationY, areaRadius, area);
|
||||
}
|
||||
}
|
||||
|
||||
public void setLocationX(int locationX) {
|
||||
this.locationX = locationX;
|
||||
}
|
||||
|
||||
public void setLocationY(int locationY) {
|
||||
this.locationY = locationY;
|
||||
}
|
||||
|
||||
public int getLocationX() {
|
||||
return locationX;
|
||||
}
|
||||
|
||||
public int getLocationY() {
|
||||
return locationY;
|
||||
}
|
||||
|
||||
public int getAreaRadius() {
|
||||
return areaRadius;
|
||||
}
|
||||
|
||||
public boolean isVisible() {
|
||||
return locationX >= 0 && locationY >= 0;
|
||||
}
|
||||
|
||||
public void setAreaRadius(int areaRadius) {
|
||||
this.areaRadius = areaRadius;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue