Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 98
#1

Почему не обнавляются preferences без перезапуска Activity (Canvas) - Программирование Android

13.12.2016, 15:02. Просмотров 193. Ответов 6
Метки нет (Все метки)

Подскажите где я что пропустила?
Вот мой canvas. В самом низу переменная "Значение списка - " + prefs не хочет обнавляться сразу после установки настроек. Но обнавляется при перезапуске canvas.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package com.livewallpaper;
 
import java.util.Timer;
import java.util.TimerTask;
 
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.graphics.PorterDuff;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
 
public class LiveWallpaperPainting extends Thread implements Runnable{
        
        private SurfaceHolder surfaceHolder;
        private static final int MAX_COUNT = 17;
        int mSettings;
        Bitmap foni;
        Bitmap pic;
        Timer timer;
        int count;
        private boolean wait;
        private boolean run;
        private Paint mScorePaint;
        public LiveWallpaperPainting(SurfaceHolder surfaceHolder, final Context context, int radius) {
                this.surfaceHolder = surfaceHolder;
                this.wait = true;
                pic = BitmapFactory.decodeResource(context.getResources(), R.drawable.p01);
                mSettings=radius;
                
                
                mScorePaint = new Paint();
                mScorePaint.setTextSize(30);
                mScorePaint.setStrokeWidth(2);
                mScorePaint.setColor(Color.WHITE);
                
                foni = BitmapFactory.decodeResource(context.getResources(), R.drawable.fon2);
                timer = new Timer(); 
                timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    if(count == MAX_COUNT ) count = 0;
                pic = BitmapFactory.decodeResource(context.getResources(), R.drawable.p01 + count);
                count++;
                  
        }
    }, 0,80);
    
    }    
        
        public void pausePainting() {
                this.wait = true;
                synchronized(this) {
                        this.notify();
                }}
        public void resumePainting() {
                this.wait = false;
                synchronized(this) {
                        this.notify();
                } }
        public void stopPainting() {
                this.run = false;
                synchronized(this) {
                        this.notify();
                }}
        @Override
        public void run() {
            
                this.run = true;
                Canvas c = null;
                while (run) {
                        try {
                                c = this.surfaceHolder.lockCanvas(null);
                                synchronized (this.surfaceHolder) {
                                        Thread.sleep(50);
                                        doDraw(c);
                                }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } finally {
                                if (c != null) {
                                        this.surfaceHolder.unlockCanvasAndPost(c);
                                }
                        }
                        synchronized (this) {
                                if (wait) {
                                        try {
                                                wait();
                                        } catch (Exception e) {}
                                }
                        }
                }
        }
        int w; int h;
        int wp; int hp;
        int wpV; int wpH;
        int ws; int hs;
        public void setSurfaceSize(int width, int height) {
             this.w = width;
             this.h = height;
             this.wp = foni.getWidth();
             this.hp = foni.getHeight();
             this.wpV = wp*11/10;
             this.wpH = w*11/10;
             this.ws = h*3/5;
             this.hs = h*3/5;
                    synchronized(this) {
                     this.notify();
             }
     }
       float t = 0;
       float t2 = 0;
       int T = -1;
       int A = -1;
         public boolean doTouchEvent(MotionEvent event) {
             switch (event.getAction()){
             case MotionEvent.ACTION_DOWN:
                 t = event.getX();
             case MotionEvent.ACTION_MOVE:
             t2 = event.getX();
             if (t < t2 & w < h & T < 0){//жест вправо при книге
                     T++;}
             if (t < t2 & w > h & A < 0){//жест вправо при альбоме
                 A++;}
             if (t > t2 & w > h & A*3 > w-wpH){//жест влево при альбоме
                     A--;}
             if (t > t2 & w < h & T*7 > w-wpV){//жест влево при книге
                 T--;}
             }
            return true;
      }
         
         private void doDraw(Canvas canvas) {
             
                canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                //canvas.drawColor(Color.WHITE);
               int prefs = mSettings;
                if (w < h){
                    Bitmap fon = Bitmap.createScaledBitmap(foni, wpV, h, false);
                    canvas.drawBitmap(fon, T*7, 0, null);// статичный фон    книжный формат
                    Bitmap bmHalf = Bitmap.createScaledBitmap(pic, ws, hs, false);
                    canvas.drawBitmap(bmHalf, T*7+w/2, h-hs, null); 
                    canvas.drawText("Значение списка - " + prefs, 50, 70, mScorePaint);
                    }
                if (w > h) {
                    Bitmap fon = Bitmap.createScaledBitmap(foni, wpH, h, false);
                    canvas.drawBitmap(fon, A*3, 0, null);// статичный фон    альбомный формат
                    Bitmap bmHalf2 = Bitmap.createScaledBitmap(pic, ws, hs, false);
                    canvas.drawBitmap(bmHalf2, A*3+w/3, h/2, null);
                    canvas.drawText("Значение списка - " + prefs, 50, 70, mScorePaint);}
                
                
                }
        
}
Вот мой сервис
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package com.livewallpaper;
 
import android.content.Context;
import android.content.SharedPreferences;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
 
public class LiveWallpaperService extends WallpaperService {
 
    public static final String APP_PREFERENCES = "mysettings";
    public static final String APP_PREFERENCE_RADIUS = "preference_radius";
    
    
    @Override
    public Engine onCreateEngine() {
                   return new SampleEngine();
    }
 
    @Override
    public void onCreate() {
            super.onCreate();
    }
 
    @Override
    public void onDestroy() {
            super.onDestroy();
    }
 
    public class SampleEngine extends Engine implements SharedPreferences.OnSharedPreferenceChangeListener {
 
            
            private LiveWallpaperPainting painting;
            private SharedPreferences prefs;
            SharedPreferences mSettings;
            
            SampleEngine() {
                    SurfaceHolder holder = getSurfaceHolder();
                    prefs = LiveWallpaperService.this.getSharedPreferences(APP_PREFERENCES, 0);
                    prefs.registerOnSharedPreferenceChangeListener(this);
                    painting = new LiveWallpaperPainting(holder, getApplicationContext(), 
                                Integer.parseInt(prefs.getString(APP_PREFERENCE_RADIUS, "10")));
                    
                    
                                        
            }
 
            public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
                                            }
 
            @Override
            public void onCreate(SurfaceHolder surfaceHolder) {
                mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
                    super.onCreate(surfaceHolder);
                    setTouchEventsEnabled(true);
            }
 
            @Override
            public void onDestroy() {
                    super.onDestroy();
                    // remove listeners and callbacks here
                    painting.stopPainting();
            }
 
            @Override
            public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                    super.onSurfaceChanged(holder, format, width, height);
                    painting.setSurfaceSize(width, height);
            }
 
            @Override
            public void onSurfaceCreated(SurfaceHolder holder) {
                    super.onSurfaceCreated(holder);
                    painting.start();
                    
            }
 
 
            @Override
            public void onVisibilityChanged(boolean visible) {
                    if (visible) {
                            painting.resumePainting();
                    } else {
                            // remove listeners and callbacks here
                            painting.pausePainting();
                    }
            }
            
            @Override
            public void onSurfaceDestroyed(SurfaceHolder holder) {
                    super.onSurfaceDestroyed(holder);
                    boolean retry = true;
                    painting.stopPainting();
                    while (retry) {
                            try {
                                    painting.join();
                                    retry = false;
                            } catch (InterruptedException e) {}
                    }
            }
 
 
            @Override
            public void onTouchEvent(MotionEvent event) {
                    super.onTouchEvent(event);
                    painting.doTouchEvent(event);
            }
            
    }
    
}
Здесь сеттинги
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.livewallpaper;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
 
public class LiveWallpaperSettings extends PreferenceActivity 
    implements SharedPreferences.OnSharedPreferenceChangeListener {
 
    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        getPreferenceManager().setSharedPreferencesName(
                LiveWallpaperService.APP_PREFERENCES);
        addPreferencesFromResource(R.xml.settings);
        getPreferenceManager().getSharedPreferences()
                .registerOnSharedPreferenceChangeListener(this);
    }
 
    @Override
    protected void onDestroy() {
        getPreferenceManager().getSharedPreferences()
                .unregisterOnSharedPreferenceChangeListener(this);
        super.onDestroy();
    }
 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {}
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2016, 15:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему не обнавляются preferences без перезапуска Activity (Canvas) (Программирование Android):

Canvas и Activity - Программирование Android
Есть класс наследующийся от activity. из которого переходишь в класс который рисует спрайты. Спрайты рисуются в потоке, собственно есть...

Как разместить EditText и область рисования Canvas в одном Activity? - Программирование Android
Как разместить EditText и область рисования Canvas в одном Activity?

Activity без AndroidManifest - Программирование Android
Возможно ли подобное? Научился создавать &quot;на лету&quot; диалоги, подставляя xml и обработчики. Все устраивает, кроме того что не на весь...

Очистка BackStack Activity, без Intent - Программирование Android
У меня есть окно авторизации, и окно регистрации. То и то это активити, на которых расположены по одному фрагменту. Из регистрации...

Почему Canvas не выводит текст? - Программирование Android
В коде, приведённом ниже вроде всё правильно, но не пойму, почему не выводится текст! MainActivity.java public class MainActivity...

Приложение зависает, если свернуть и развернуть Activity или перейти на другую Activity - Программирование Android
У меня в параллельном потоке происходит куча apply() Решение использовать apply вместо commit было принято из-за скорости. Но...

6
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
13.12.2016, 15:23 #2
наверное потому что когда срабатывает onSharedPreferenceChanged в сервисе, там нигде не вызывается метод для обновления канваса
0
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 98
13.12.2016, 15:32  [ТС] #3
подскажите кодом как подправить. пожалуйста
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
13.12.2016, 15:41 #4
я в код вообще не вникал, поэтому наугад

в сервисе метод
Java
1
2
3
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
painting.someMethod();
}
внутри метода someMethod() берем канвас откуда он там берется и вызываем onDraw(canvas);
0
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 98
13.12.2016, 16:52  [ТС] #5
прописываю в сервисе
Java
1
2
3
private void someMethod(Canvas canvas){
     super.onDraw(canvas); 
}
выскакивает куча ошибок
0
Pablito
13.12.2016, 16:54
  #6

Не по теме:

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

0
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 98
13.12.2016, 19:13  [ТС] #7
написала такой метод в LiveWallpaperPainting - не работает
Java
1
2
3
4
5
6
public void someMethod()
        {
           this.run = false;    
            Canvas canvas = null;
           doDraw(canvas);
    }
как мне все-таки перезапустить Canvas?

Добавлено через 22 секунды
написала такой метод в LiveWallpaperPainting - не работает
Java
1
2
3
4
5
6
public void someMethod()
        {
           this.run = false;    
            Canvas canvas = null;
           doDraw(canvas);
    }
как мне все-таки перезапустить Canvas?

Добавлено через 3 минуты
написала в LiveWallpaperPainting - не работает
Java
1
2
3
4
5
6
public void someMethod()
        {
           this.run = false;    
            Canvas canvas = null;
           doDraw(canvas);
    }
как же мне все-таки перезапустить Canvas?
0
13.12.2016, 19:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2016, 19:13
Привет! Вот еще темы с ответами:

Изменение layout-элементов одного activity из другого activity - Программирование Android
Здравствуйте! Я хочу изменить размер или цвет текста TextView в одном activity из второго activity, каким образом мне можно это...

Android - Передача данных с одного Activity на другое Activity - Программирование Android
Здравствуйте , возникла необходимость получения числовых (int и float ну или double) данных в одном Activity , а обработка и вывод...

Из одной Activity запустить функцию другой Activity - Программирование Android
например есть Activity2 которое я показываю в Dialog окошке, там у меня находятся Date and Time Picker ы (Дата - начало, Дата - окончание)...

Из одного Activity получить значение другого Activity - Программирование Android
Запускаю активити: public class MainActivity extends Activity { ... ... Intent intent = new Intent(getBaseContext(),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru