С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
14 / 14 / 8
Регистрация: 09.10.2014
Сообщений: 71

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

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

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


ps. Везде находил примеры сторонних изображений загруженных через ресурсы.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2015, 13:56
Ответы с готовыми решениями:

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

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

Цвет пикселя экрана android-устройства
Здравствуйте. Реально ли получить цвет пикселя экрана android-устройства, напрямую? Нашёл в сети такой код (Get the colour of a...

13
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
02.08.2015, 14:42
Тут почистай
1
14 / 14 / 8
Регистрация: 09.10.2014
Сообщений: 71
02.08.2015, 18:32  [ТС]
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
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
02.08.2015, 21:30
Zoomskij, можно весь код увидеть, а то на на словах не понятно.
0
14 / 14 / 8
Регистрация: 09.10.2014
Сообщений: 71
03.08.2015, 10:17  [ТС]
Когда я цвет объекта задаю статически, допустим фон, он его определяет верно: #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;
    }
 
}
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
03.08.2015, 13:58
Лучший ответ Сообщение было отмечено 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
14 / 14 / 8
Регистрация: 09.10.2014
Сообщений: 71
03.08.2015, 14:18  [ТС]
Mikalai, Да так действительно заработало! А много лишнего когда от того, что пост готовил и лишнее старался удалить, но видимо не всё. Спасибо!
0
 Аватар для dimitriy951
3 / 2 / 2
Регистрация: 15.11.2013
Сообщений: 110
03.01.2017, 19:28
Помогите пожлст тажа беда третий день бьюсь при сохранении получаю не то что есть . Переделал как выше товарищ делал непомогло

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
14 / 14 / 8
Регистрация: 09.10.2014
Сообщений: 71
03.01.2017, 20:12  [ТС]
dmitriy951, С Новым Годом, тебя! Чистого кода и чтобы каждая компиляция проходила без ошибок, удачи
0
 Аватар для dimitriy951
3 / 2 / 2
Регистрация: 15.11.2013
Сообщений: 110
03.01.2017, 20:26
Спасибо, тебя тоже с новым! , смотрел код ? есть какие предложения?
0
14 / 14 / 8
Регистрация: 09.10.2014
Сообщений: 71
03.01.2017, 20:43  [ТС]
dmitriy951, извинт, сейчас далеко от компьютера и андроид давно забросил, но вот нашел архив с той программой, где этот метод работает. Прикреплю целиком весь архив. Можешь даже запустить проект.
Вложения
Тип файла: 7z Colors.7z (9.60 Мб, 8 просмотров)
0
 Аватар для dimitriy951
3 / 2 / 2
Регистрация: 15.11.2013
Сообщений: 110
03.01.2017, 21:02
Спасибочки гляну , какой пароль?
0
14 / 14 / 8
Регистрация: 09.10.2014
Сообщений: 71
03.01.2017, 21:33  [ТС]
Пароль: 1
Даже не открывал архив
0
 Аватар для dimitriy951
3 / 2 / 2
Регистрация: 15.11.2013
Сообщений: 110
07.01.2017, 15:32
Решил задачку(слепил костыль) - после отрисовки конвы билдю кеш и сохраняю его в 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.01.2017, 15:32
Помогаю со студенческими работами здесь

Получить цвет пикселя на экране по координатам на delphi
Нужно быстро (несколько раз в секунду) получить цвет пикселя экрана в другом приложении. adb shell screencap &gt; screen.png и adb...

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

Узнать цвет определенного пикселя на экране
Привет всем:) столкнулся с проблемой, а проблема состоит в том, что я хочу узнать цвет определенного пикселя на своем екране... Я знаю...

Как узнать цвет пикселя на форме
СПАСИБО

Как узнать цвет пикселя изображения?
Что нужно использовать, чтобы узнать цвет конкретного(зная его координаты) пикселя изображения?


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru