2015-03-30 3 views
1

У меня есть проект, который добавляет точки к карте. Для карты мы используем GestureImageView, чтобы сделать ее прокручиваемой и для кнопок ImageButton.Фиксированное положение ImageButton на GestureImageView

Но происходит следующая проблема: всякий раз, когда мы перемещаем карту, мы должны убедиться, что точечные точки остаются в положении.

Проблема в том, что мы называем функцию трансляции ImageButton из другого потока внутри GestureImageView, и вам не разрешено вызывать это представление.

E/AndroidRuntime﹕ FATAL EXCEPTION: GestureImageViewAnimator 
Process: nl.example.android, PID: 17024 
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6915) 
    at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1089) 
    at android.view.ViewGroup.invalidateChildFast(ViewGroup.java:4639) 
    at android.view.View.invalidateViewProperty(View.java:11748) 
    at android.view.View.setTranslationY(View.java:11102) 
    at nl.example.android.GestureImageView.setPosition(GestureImageView.java:455) 
    at nl.example.android.GestureImageViewTouchListener.handleDrag(GestureImageViewTouchListener.java:449) 
    at nl.example.android.GestureImageViewTouchListener$1.onMove(GestureImageViewTouchListener.java:122) 
    at nl.example.android.FlingAnimation.update(FlingAnimation.java:49) 
    at nl.example.android.Animator.run(Animator.java:45) 

То, что я пытался в настоящее время: Класс для контекста деятельности

public class MyActivity extends Activity { 
    private static Activity activity; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     activity = this; 
    } 
} 

Код в GestureImageView:

final float transX = x; 
MyActivity myActivity = new MyActivity(); 
myActivity.runOnUiThread(new Runnable() { 
    public void run() { 
     setTranslationY(transX); 
    } 
}); 

Код в MainActivity:

MyActivity myActivity = new MyActivity(); 
Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     pin1.setTranslationY(3); 
     synchronized(this){ 
      this.notify(); 
     } 
    } 
}; 

synchronized(runnable) { 
    myActivity.runOnUiThread(runnable); 
    runnable.wait() ; // unlocks myRunable while waiting 
} 
+0

Смотрите мой редактировать в настоящее время. – barwnikk

ответ

0

В файле GestureImageView, строка 455 try it:

activity.runOnUiThread(new Runnable(){ 
    public void run(){ 
     setTranslationZ(x); 
    } 
}); 

Вы не можете вызывать функцию просмотра из других. Вы должны вызвать его на главном. Если вы хотите ждать завершения выполнения runOnUiThread, используйте:

Runnable r = new Runnable(){public void run(){ 
     setTranslationZ(...); 
     synchronized(this){ 
      this.notify(); 
     } 
    }}; 
    synchronized(myRunnable) { 
     activity.runOnUiThread(myRunnable); 
     myRunnable.wait() ; // unlocks myRunable while waiting 
    } 

Edit для людей, которые не знают, как использовать runOnUiThread:

class GestureImageView extends View{ 
    private long thread; 
    public GestureImageView(Context c){ 
     super(c); 
     thread=Thread.currentThread().getId(); 
    } 
    public void setTranslationZ(final int n){ 
     if(thread==Thread.currentThread().getId()){ //this is UI thread 
      super.setTranslationZ(n); 
     } else { 
      MainActivity.instance.runOnUiThread(new Runnable(){ 
        public void run() { 
         setTranslationZ(n); 
        } 
       }); 
     } 
    } 
} 
public class MainActivity extends Activity 
{ 
public static Activity instance; 
public MainActivity(){ 
    instance=this; 
} 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

} 
} 
+0

Как я могу реализовать activity.runOnUiThread, когда GestureImageView не является активностью. – Stefan

+0

Сохранить деятельность в поле? – barwnikk

+0

http://stackoverflow.com/questions/20044163/starting-an-android-activity-from-a-static-method заменить «Контекст» на «Активность». – barwnikk

Смежные вопросы