Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Zoomskij
13 / 13 / 8
Регистрация: 09.10.2014
Сообщений: 71
1

OnTouch узнать цвет пикселя

02.08.2015, 13:56. Просмотров 1283. Ответов 13
Метки нет (Все метки)

Добрый день, форумчане! Начал как хобби изучать андройд программирование. Работаю в Android studio.
Сейчас создал проект с Draw2D с Canvas. стандартными средствами нарисовал примитивы.
Вопрос: как можно по клику пользователя узнать какой цвет он выбрал? (цвет пикселя)?
OnTouch узнать цвет пикселя


ps. Везде находил примеры сторонних изображений загруженных через ресурсы.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2015, 13:56
Ответы с готовыми решениями:

Программно узнать цвет пикселя
Здравствуйте) Можно ли програмно узнать цвет пикселя... тойсть задаю...

Изменить цвет пикселя на изображении
Почему в телефоне приложение завершается (тоесть ошибка) если в загруженном...

Цвет пикселя экрана android-устройства
Здравствуйте. Реально ли получить цвет пикселя экрана android-устройства,...

Получить цвет пикселя на экране по координатам на delphi
Нужно быстро (несколько раз в секунду) получить цвет пикселя экрана в другом...

Как в обьекте canvas определить цвет пикселя с заданными координатами
как в обьекте canvas определить цвет пикселя с заданными координатами? Или...

13
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 670
02.08.2015, 14:42 2
Тут почистай
1
Zoomskij
13 / 13 / 8
Регистрация: 09.10.2014
Сообщений: 71
02.08.2015, 18:32  [ТС] 3
Mikalai, Спасибо, статься помогла! Но осталась проблема когда я цвет генерирую рандомно.

Допустим если я цвет указываю статически:
Java
1
mPaint.setColor(Color.rgb(color.GREEN));
и затем в методе OnTouch получаю его методом:
Java
1
colorRGB = this.getDrawingCache(true).getPixel((int)event.getX(),(int)event.getY());
То мне все верно отображается цвет #00FF00 (Зеленый)

Но если я указываю цвет объекта через рандом:
Java
1
mPaint.setColor(Color.rgb(random.nextInt(255),random.nextInt(255),random.nextInt(255)));
и затем нажимаю на объект, то получаю совсем не те цвета, которым нарисован объект... Может где-то нужно обновлять кеш...
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 670
02.08.2015, 21:30 4
Zoomskij, можно весь код увидеть, а то на на словах не понятно.
0
Zoomskij
13 / 13 / 8
Регистрация: 09.10.2014
Сообщений: 71
03.08.2015, 10:17  [ТС] 5
Когда я цвет объекта задаю статически, допустим фон, он его определяет верно: #FFAAAAAA.
Но если я задаю цвет через рандом, при запуске он определяется всегда по-разному ( на анимации: #FF119FBE), но при последующих кликах, цвет объекта меняется а значение остается неизменным.
Как получить верное значение цвета объекта?
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
public class Draw2D extends View  {
    public Draw2D(Context context) {
        super(context);
        setFocusable(true);
        
        mBitmap = Bitmap.createBitmap(480, 860, Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);
        this.setDrawingCacheEnabled(true);
    }
    int colorRGB;
    Bitmap mBitmap;
    Canvas mCanvas ;
    Path mPath ;
    Paint mBitmapPaint ;
 
    private Paint mPaint = new Paint();
    private Bitmap bitmap;
 
 
    @Override
    protected void onDraw(Canvas canvas){
        //  Узнаем размеры экрана
        DisplayMetrics displaymetrics = getResources().getDisplayMetrics();
        int height = displaymetrics.heightPixels;
        int width = displaymetrics.widthPixels;
 
        super.onDraw(canvas);
 
        //Заливка
        canvas.drawColor(0xFFAAAAAA);
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
        canvas.drawPath(mPath, mPaint);
        bitmap = this.getDrawingCache(true);
 
        //рисуем прямоугольник
        //mPaint.setColor(Color.GREEN);
        Random random = new Random();
        mPaint.setColor(Color.rgb(random.nextInt(255),random.nextInt(255),random.nextInt(255)));
        canvas.drawRect(0, 0, width, height / 2, mPaint);
 
 
        //отображаем текст
        mPaint.setColor(Color.BLUE);
        mPaint.setStyle((Paint.Style.FILL));
        mPaint.setAntiAlias(true);
        mPaint.setTextSize(32);
        canvas.drawText("RGB = " + Integer.toHexString(colorRGB),10,340,mPaint);
    }
 
 
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                bitmap = this.getDrawingCache(true);
                colorRGB = bitmap.getPixel((int) event.getX(), (int) event.getY());
                invalidate();
                break;
        }
        return true;
    }
 
}
OnTouch узнать цвет пикселя
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 670
03.08.2015, 13:58 6
Лучший ответ Сообщение было отмечено Zoomskij как решение

Решение

Много лишнего в коде. Вот так вроде работает:

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
class Draw2D extends View {
    public Draw2D(Context context) {
        super(context);
        setFocusable(true);
        setDrawingCacheEnabled(true);
    }
 
    int colorRGB;
    private Paint mPaint = new Paint();
 
 
    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
 
        DisplayMetrics displaymetrics = getResources().getDisplayMetrics();
        int height = displaymetrics.heightPixels;
        int width = displaymetrics.widthPixels;
 
        //Заливка
        canvas.drawColor(0xFFFFFFFF);
 
        //рисуем прямоугольник
        //mPaint.setColor(Color.GREEN);
        Random random = new Random();
        mPaint.setColor(Color.rgb(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
        canvas.drawRect(0, 0, width, height / 2, mPaint);
 
 
 
        //отображаем текст
        mPaint.setColor(Color.BLUE);
        mPaint.setStyle((Paint.Style.FILL));
        mPaint.setAntiAlias(true);
        mPaint.setTextSize(32);
        canvas.drawText("RGB = " + Integer.toHexString(colorRGB),10,340,mPaint);
 
        buildDrawingCache();
    }
 
 
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                colorRGB = getDrawingCache().getPixel((int) event.getX(), (int) event.getY());
                destroyDrawingCache();
                invalidate();
                break;
        }
        return true;
    }
 
}
1
Zoomskij
13 / 13 / 8
Регистрация: 09.10.2014
Сообщений: 71
03.08.2015, 14:18  [ТС] 7
Mikalai, Да так действительно заработало! А много лишнего когда от того, что пост готовил и лишнее старался удалить, но видимо не всё. Спасибо!
0
dimitriy951
2 / 2 / 1
Регистрация: 15.11.2013
Сообщений: 109
03.01.2017, 19:28 8
Помогите пожлст тажа беда третий день бьюсь при сохранении получаю не то что есть . Переделал как выше товарищ делал непомогло

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
package dmitriy.deomin.generateawallpaper;
import android.app.WallpaperManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
/**
 * Created by dimon on 31.12.16.
 */
 
class Holst extends View{
 
    Paint kist = new Paint();
    int run = 0;
    int w;
    int h;
 
    Holst(Context context) {
        super(context);
        this.setFocusable(true);
        this.setDrawingCacheEnabled(true);
    }
 
    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
 
        w = canvas.getWidth();
        h = canvas.getHeight();
 
            if (run == 1) {
                // при генерации картинок
 
                canvas.drawColor(random_color());
 
 
                kist.setAntiAlias(true);
                kist.setStrokeWidth(10);
                kist.setColor(random_color());
 
 
                for (int l = 0; l < random_nomer(0, 20); l++) {
                    int wrand = random_nomer(0, w);
 
                    for (int i = 0; i < random_nomer(0, h); i++) {
                        canvas.drawPoint(wrand, i, kist);
                    }
                }
 
                canvas.drawRect(random_nomer(0, w), random_nomer(0, h), random_nomer(0, w), random_nomer(0, h), kist);
                canvas.drawCircle(random_nomer(0, w), random_nomer(0, h), random_nomer(0, w), kist);
            }
 
            if (run == 0) {
                //при первом запуске проги
                canvas.drawColor(random_color());
 
                Paint shadowPaint = new Paint();
 
                shadowPaint.setAntiAlias(true);
                shadowPaint.setTextAlign(Paint.Align.CENTER);
                shadowPaint.setColor(Color.WHITE);
                shadowPaint.setTextSize(100);
                shadowPaint.setStrokeWidth(2.0f);
                shadowPaint.setStyle(Paint.Style.STROKE);
                shadowPaint.setShadowLayer(5.0f, 10.0f, 10.0f, Color.BLACK);
 
                canvas.drawText(getContext().getString(R.string.Ustanovit), w / 2, 200, shadowPaint);
                canvas.drawText(getContext().getString(R.string.Sgeneririvat), w / 2, h - 200, shadowPaint);
 
                run = 1;
 
            }
 
        this.buildDrawingCache();
 
 
        }
 
 
 
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
 
 
                if(event.getY()<(h/2)) {
 
                    String url_img = "/Pictures/Generateawallpaper/" + "Gen" + System.currentTimeMillis() + ".png";
 
                    //тут получаю не то что есть на экране
                    Bitmap bmp = this.getDrawingCache();
 
                    //создадим папки если нет
                    File sddir = new File(Environment.getExternalStorageDirectory().toString() + "/Pictures/Generateawallpaper/");
                    if (!sddir.exists()) {
                        sddir.mkdirs();
                    }
 
                    try {
                        FileOutputStream fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory().toString(), url_img));
                        bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
                        fos.flush();
                        fos.close();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
 
 
                    //после сохранения установим картинку обоями
 
                    //********
                    WallpaperManager wallpaperManager = WallpaperManager.getInstance(getContext());
                    try {
                        wallpaperManager.setBitmap(bmp);
                        Toast.makeText(getContext(), R.string.save_i_ustanovleno, Toast.LENGTH_SHORT).show();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    //************
                    bmp=null;
                }else {
                    // иначе обновляем экран
                    this.destroyDrawingCache();
                    this.invalidate();
                }
 
                break;
        }
        return true;
    }
 
    int random_color(){
        int r = random_nomer(0,255);
        int g = random_nomer(0,255);
        int b = random_nomer(0,255);
        return Color.rgb(r, g, b);
    }
    int random_nomer(int min,int max){
        max -= min;
        return (int) (Math.random() * ++max) + min;
    }
}
0
Zoomskij
13 / 13 / 8
Регистрация: 09.10.2014
Сообщений: 71
03.01.2017, 20:12  [ТС] 9
dmitriy951, С Новым Годом, тебя! Чистого кода и чтобы каждая компиляция проходила без ошибок, удачи
0
dimitriy951
2 / 2 / 1
Регистрация: 15.11.2013
Сообщений: 109
03.01.2017, 20:26 10
Спасибо, тебя тоже с новым! , смотрел код ? есть какие предложения?
0
Zoomskij
13 / 13 / 8
Регистрация: 09.10.2014
Сообщений: 71
03.01.2017, 20:43  [ТС] 11
dmitriy951, извинт, сейчас далеко от компьютера и андроид давно забросил, но вот нашел архив с той программой, где этот метод работает. Прикреплю целиком весь архив. Можешь даже запустить проект.
0
Вложения
Тип файла: 7z Colors.7z (9.60 Мб, 3 просмотров)
dimitriy951
2 / 2 / 1
Регистрация: 15.11.2013
Сообщений: 109
03.01.2017, 21:02 12
Спасибочки гляну , какой пароль?
0
Zoomskij
13 / 13 / 8
Регистрация: 09.10.2014
Сообщений: 71
03.01.2017, 21:33  [ТС] 13
Пароль: 1
Даже не открывал архив
0
dimitriy951
2 / 2 / 1
Регистрация: 15.11.2013
Сообщений: 109
07.01.2017, 15:32 14
Решил задачку(слепил костыль) - после отрисовки конвы билдю кеш и сохраняю его в Bitmap потом его ого обратно в канву
в результате что нарисовано то и в Bitmap 100%

buildDrawingCache();
bmp = getDrawingCache();
canvas.drawBitmap(bmp,0,0,null);


вот полный код
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
package dmitriy.deomin.generateawallpaper;
 
import android.app.WallpaperManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
/**
 * Created by dimon on 31.12.16.
 */
 
public class Holst extends View {
 
    Paint kist = new Paint();
    Bitmap bmp;
    int w;
    int h;
 
    public Holst(Context context) {
        super(context);
        setDrawingCacheEnabled(true);
        w = Main.wd;
        h = Main.hd;
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
 
        if (Main.run == 1) {
 
            canvas.drawColor(random_color());
 
            kist.setAntiAlias(true);
            kist.setStrokeWidth(10);
            kist.setColor(random_color());
 
 
            for (int l = 0; l < random_nomer(0, 20); l++) {
                int wrand = random_nomer(0, w);
 
                for (int i = 0; i < random_nomer(0, h); i++) {
                    canvas.drawPoint(wrand, i, kist);
                }
            }
 
            canvas.drawRect(random_nomer(0, w), random_nomer(0, h), random_nomer(0, w), random_nomer(0, h), kist);
            canvas.drawCircle(random_nomer(0, w), random_nomer(0, h), random_nomer(0, w), kist);
 
            buildDrawingCache();
 
            bmp = getDrawingCache();
 
            canvas.drawBitmap(bmp,0,0,null);
 
        }
 
        if (Main.run == 0) {
            //при первом запуске проги
            canvas.drawColor(random_color());
 
            Paint shadowPaint = new Paint();
 
            shadowPaint.setAntiAlias(true);
            shadowPaint.setTextAlign(Paint.Align.CENTER);
            shadowPaint.setColor(Color.WHITE);
            shadowPaint.setTextSize(100);
            shadowPaint.setStrokeWidth(2.0f);
            shadowPaint.setStyle(Paint.Style.STROKE);
            shadowPaint.setShadowLayer(5.0f, 10.0f, 10.0f, Color.BLACK);
 
            canvas.drawText(getContext().getString(R.string.Ustanovit), w / 2, 200, shadowPaint);
            canvas.drawText(getContext().getString(R.string.Sgeneririvat), w / 2, h - 200, shadowPaint);
 
            buildDrawingCache();
 
            bmp = getDrawingCache();
 
            canvas.drawBitmap(bmp,0,0,null);
        }
 
 
 
        super.onDraw(canvas);
 
    }
 
    public int random_color() {
        int r = random_nomer(0, 255);
        int g = random_nomer(0, 255);
        int b = random_nomer(0, 255);
        return Color.rgb(r, g, b);
    }
    public int random_nomer(int min, int max) {
        max -= min;
        return (int) (Math.random() * ++max) + min;
    }
 
 
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getY()<(h/2)) {
 
            String url_img = "/Pictures/Generateawallpaper/" + "Gen" + System.currentTimeMillis() + ".png";
 
//создадим папки если нет
            File sddir = new File(Environment.getExternalStorageDirectory().toString() + "/Pictures/Generateawallpaper/");
            if (!sddir.exists()) {
                sddir.mkdirs();
            }
 
            try {
                FileOutputStream fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory().toString(), url_img));
                bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
                fos.flush();
                fos.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
 
 
            //после сохранения установим картинку обоями
 
            //********
            WallpaperManager wallpaperManager = WallpaperManager.getInstance(getContext());
            try {
                wallpaperManager.setBitmap(bmp);
                Toast.makeText(getContext(), R.string.save_i_ustanovleno, Toast.LENGTH_SHORT).show();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //************
 
 
        }else {
            Main.run = 1;
            destroyDrawingCache();
            invalidate();
        }
        return  false;
    }
}
0
07.01.2017, 15:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2017, 15:32

registerForContextMenu и ontouch
Здравствуйте! Столкнулся с проблемой: при единичном нажатии на экран,...

OnTouch и onLongClick
вот есть ImageButon btnAdd @Override public boolean onTouch(final View...

Не работает метод onTouch
Есть два TextView надо чтобы по нажатию на одно textView в другом появлялся...


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

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

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