2012-01-12 15 views
6

मैं एक साधारण मानचित्र एप्लिकेशन विकसित करने की कोशिश कर रहा हूं, जो स्क्रीन में एक मानचित्र प्रदर्शित करेगा।Android पर ImageView पर लाइनों को कैसे आकर्षित करें?

जब उपयोगकर्ता कर्सर को स्क्रीन पर ले जाता है, तो मैं अपने मानचित्र पर 2 लंबवत रेखाएं प्रदर्शित करना चाहता हूं। मैंने इसके लिए एक विचार पाने के लिए कई उदाहरणों की कोशिश की थी, लेकिन दुर्भाग्य से, सफल नहीं हुआ। मैं इसे कैसे बना सकता हूं?

और एक पिछले प्रश्न के रूप में here मैंने कोशिश की थी। लेकिन जवाब नहीं मिला। क्या कोई मुझे मार्गदर्शन कर सकता है?

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <LinearLayout android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    <ImageView android:id="@+id/main_imagemap" 
     android:src="@drawable/worldmap" 
     android:clickable="true" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 
    </LinearLayout> 

</LinearLayout> 

और मेरी गतिविधि फ़ाइल (मैं सिर्फ यह शुरू कर दिया था ..)

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.ImageView; 

public class LineMapActivity extends Activity 
{ 


    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ImageView map_image = (ImageView)findViewById(R.id.main_imagemap); 

    } 
} 

और उस लिंक के रूप में, मैं भी MyImageView जोड़ा था:

मेरे main.xml निम्नलिखित के रूप में है ।

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.widget.ImageView; 

public class MyImageView extends ImageView 
{ 

    public MyImageView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); 
     canvas.drawLine(0, 0, 20, 20, p); 
     super.onDraw(canvas); 
    } 
} 

अब मैं अपने ऐप में यह MyImageView कैसे जोड़ सकता हूं?

+0

में और अधिक जानकारी प्राप्त कर सकते हैं? इस ट्यूटोरियल को देखें http://codemagician.wordpress.com/2010/05/06/android-google-mapview-tutorial-done-right/ – MikeIsrael

+0

नहीं मेरे प्रिय .. मैं सिर्फ एंड्रॉइड में एक नया मधुमक्खी हूँ .. मैं हूँ सिर्फ drawables से एक छवि जोड़ना। मैं बस एक छवि के ऊपर रेखा खींचने का अध्ययन करना चाहता हूं .. पुराने ब्लैकबेरी फोन की तरह –

+0

ठीक है मेरे उत्तर की जांच करें, यह आपको इच्छित परिणाम प्राप्त करना चाहिए। – MikeIsrael

उत्तर

4

अंत में मैंने एक समाधान निकाला। यह एक साधारण कार्यक्रम है जो एक छवि पर एक रेखा खींचता है। यहाँ

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <LinearLayout android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    <com.ImageDraw.MyImageView android:id="@+id/main_imagemap" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 
    </LinearLayout> 
</LinearLayout> 

और मुख्य गतिविधि है:

यहाँ मेरी main.xml फ़ाइल (com.ImageDraw.MyImageView अपने कस्टम देखने के लिए, नीचे दिए गए कोड है)

import android.app.Activity; 
import android.os.Bundle; 

public class MyActivity extends Activity 
{ 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

और यह वह जगह है मेरी कस्टम छवि दृश्य (MyImageView):

01:

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class MyImageView extends SurfaceView implements SurfaceHolder.Callback 
{ 
    private CanvasThread canvasthread; 

    public MyImageView(Context context) { 
     super(context); 
     getHolder().addCallback(this); 
     canvasthread = new CanvasThread(getHolder(), this); 
     setFocusable(true); 
    } 

    public MyImageView(Context context, AttributeSet attrs) 
    { 
     super(context,attrs); 
     getHolder().addCallback(this); 
     canvasthread = new CanvasThread(getHolder(), this); 
     setFocusable(true); 
    } 

    protected void onDraw(Canvas canvas) { 
     Log.d("ondraw", "ondraw"); 
     Paint p = new Paint(); 
     Bitmap mapImg = BitmapFactory.decodeResource(getResources(), R.drawable.mybitmap); 
     canvas.drawColor(Color.BLACK); 
     canvas.drawBitmap(mapImg, 0, 0, null); 
     p.setColor(Color.RED); 
     canvas.drawLine(0, 0, 100, 100, p); 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     canvasthread.setRunning(true); 
     canvasthread.start(); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     boolean retry = true; 
     canvasthread.setRunning(false); 
     while (retry) 
     { 
      try 
      { 
       canvasthread.join(); 
       retry = false; 
      } 
      catch (InterruptedException e) { 
       // TODO: handle exception 
      } 
     } 
    } 
} 

और अंत में यहाँ मेरी CanvasThread है

import android.graphics.Canvas; 
import android.view.SurfaceHolder; 

public class CanvasThread extends Thread 
{ 
    private SurfaceHolder surfaceHolder; 
    private MyImageView myImageView; 
    private boolean run = false; 

    public CanvasThread(SurfaceHolder s, MyImageView m) 
    { 
     surfaceHolder = s; 
     myImageView = m; 
    } 

    public void setRunning(boolean r) 
    { 
     run = r; 
    } 

    public void run() 
    { 
     Canvas c; 
     while(run) 
     { 
      c=null; 
      try 
      { 
       c= surfaceHolder.lockCanvas(null); 
       synchronized (surfaceHolder) { 
        myImageView.onDraw(c); 
       } 
      } 
      finally 
      { 
       if(c!=null) 
       { 
        surfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 
    } 
} 

आप क्यों तुम MapView और ओवरले उपयोग नहीं कर रहे इस tutorial

+2

माइकइज़राइल के लिए विशेष धन्यवाद, जिसने मुझे बहुत मदद की .... और उस साइट पर भी। .. –

+1

अच्छा लग रहा है। यदि बाद में आप पाते हैं कि आप मूल छवि को संरक्षित करना चाहते हैं, तो आप हमेशा एक myimageview द्वारा ओवरलैप किए गए एक छविदृश्य को भी देख सकते हैं। सौभाग्य! – MikeIsrael

+0

आप xml में एक relativelayout के साथ ओवरलैप कर सकते हैं और गुण संरेखित कर सकते हैं, बस इसके लिए खोजें कि आपको बहुत सारी जानकारी मिल जाएगी। फिर आप केवल शीर्ष छविदृश्य पर आकर्षित कर सकते हैं और यदि आप चाहें तो मिटाने के लिए नीचे छोड़ दें। – MikeIsrael

1

त्रुटि आप प्राप्त कर रहे हैं क्योंकि आप ImageView ऑब्जेक्ट को MyImageView ऑब्जेक्ट पर कास्टिंग करने का प्रयास कर रहे हैं।

+0

तो मुझे MyImageView को कैसे निहित करने की आवश्यकता है जो उस लिंक में है जिसे मैंने प्रश्न में दिया था? या क्या आप दिखा सकते हैं कि क्या मैं एक छविदृश्य के ऊपर रेखा खींच सकता हूं? –

+0

कृपया पूरा लॉग पेस्ट करें। – jeet

+0

प्रिय मैंने अपना प्रश्न अपडेट किया था। आशा है कि आपको वह विचार मिलेगा जो मैंने पूछा था। एक बार मैं इसका वर्णन करूंगा, मुझे एक ऐप चाहिए जो पृष्ठभूमि के रूप में एक छवि प्रदर्शित करता है। और उस पर रेखा भी खींच सकते हैं। वे सभी कोड मेरे प्रयोग हैं। इस कोड के काम के बारे में निश्चित नहीं है .. –

1

बस एक्सएमएल ठीक तो जैसे एक imageView के बजाय अपने वस्तु शामिल करने के लिए (ध्यान दें कि com.your.package.MyImageView और अपने क्लास वाली पैकेज का पूरा पैकेज का नाम तो वर्ग के नाम होना चाहिए)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <LinearLayout android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    <com.your.package.MyImageView android:id="@+id/main_imagemap" 
     android:src="@drawable/worldmap" 
     android:clickable="true" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 
    </LinearLayout> 

</LinearLayout> 
+0

मेरे पास पैकेज com.mymap के रूप में मेरा पैकेज है; और इसलिए मैंने अपने xml को

+0

को मजबूर करने के लिए मजबूर करता है क्या आप त्रुटि के लिए लॉगकैट पोस्ट कर सकते हैं? – MikeIsrael

+0

जो वास्तव में मदद नहीं करता है, आपको यह पता लगाने के लिए पूरे स्टैकट्रैक को पेस्ट करने की आवश्यकता है कि आपकी त्रुटि कहां है। – MikeIsrael

संबंधित मुद्दे