Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Zoomskij
13 / 13 / 3
Регистрация: 09.10.2014
Сообщений: 71
#1

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

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

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

ps. Везде находил примеры сторонних изображений загруженных через ресурсы.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mikalai
253 / 229 / 92
Регистрация: 11.01.2015
Сообщений: 648
02.08.2015, 14:42     OnTouch узнать цвет пикселя #2
Тут почистай
Zoomskij
13 / 13 / 3
Регистрация: 09.10.2014
Сообщений: 71
02.08.2015, 18:32  [ТС]     OnTouch узнать цвет пикселя #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)));
и затем нажимаю на объект, то получаю совсем не те цвета, которым нарисован объект... Может где-то нужно обновлять кеш...
Mikalai
253 / 229 / 92
Регистрация: 11.01.2015
Сообщений: 648
02.08.2015, 21:30     OnTouch узнать цвет пикселя #4
Zoomskij, можно весь код увидеть, а то на на словах не понятно.
Zoomskij
13 / 13 / 3
Регистрация: 09.10.2014
Сообщений: 71
03.08.2015, 10:17  [ТС]     OnTouch узнать цвет пикселя #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 узнать цвет пикселя
Mikalai
253 / 229 / 92
Регистрация: 11.01.2015
Сообщений: 648
03.08.2015, 13:58     OnTouch узнать цвет пикселя #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Много лишнего в коде. Вот так вроде работает:

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;
    }
 
}
Zoomskij
13 / 13 / 3
Регистрация: 09.10.2014
Сообщений: 71
03.08.2015, 14:18  [ТС]     OnTouch узнать цвет пикселя #7
Mikalai, Да так действительно заработало! А много лишнего когда от того, что пост готовил и лишнее старался удалить, но видимо не всё. Спасибо!
dimitriy951
 Аватар для dimitriy951
1 / 1 / 0
Регистрация: 15.11.2013
Сообщений: 109
03.01.2017, 19:28     OnTouch узнать цвет пикселя #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;
    }
}
Zoomskij
13 / 13 / 3
Регистрация: 09.10.2014
Сообщений: 71
03.01.2017, 20:12  [ТС]     OnTouch узнать цвет пикселя #9
dmitriy951, С Новым Годом, тебя! Чистого кода и чтобы каждая компиляция проходила без ошибок, удачи
dimitriy951
 Аватар для dimitriy951
1 / 1 / 0
Регистрация: 15.11.2013
Сообщений: 109
03.01.2017, 20:26     OnTouch узнать цвет пикселя #10
Спасибо, тебя тоже с новым! , смотрел код ? есть какие предложения?
Zoomskij
13 / 13 / 3
Регистрация: 09.10.2014
Сообщений: 71
03.01.2017, 20:43  [ТС]     OnTouch узнать цвет пикселя #11
dmitriy951, извинт, сейчас далеко от компьютера и андроид давно забросил, но вот нашел архив с той программой, где этот метод работает. Прикреплю целиком весь архив. Можешь даже запустить проект.
Вложения
Тип файла: 7z Colors.7z (9.60 Мб, 3 просмотров)
dimitriy951
 Аватар для dimitriy951
1 / 1 / 0
Регистрация: 15.11.2013
Сообщений: 109
03.01.2017, 21:02     OnTouch узнать цвет пикселя #12
Спасибочки гляну , какой пароль?
Zoomskij
13 / 13 / 3
Регистрация: 09.10.2014
Сообщений: 71
03.01.2017, 21:33  [ТС]     OnTouch узнать цвет пикселя #13
Пароль: 1
Даже не открывал архив
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2017, 15:32     OnTouch узнать цвет пикселя
Еще ссылки по теме:

Android Получить цвет пикселя на экране по координатам на delphi
Android Вылет onTouch(), перетаскивание
OnTouch из активити для View Android
Android Изменить цвет пикселя на изображении
Android OnTouch на элементе меню

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

Или воспользуйтесь поиском по форуму:
dimitriy951
 Аватар для dimitriy951
1 / 1 / 0
Регистрация: 15.11.2013
Сообщений: 109
07.01.2017, 15:32     OnTouch узнать цвет пикселя #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;
    }
}
Yandex
Объявления
07.01.2017, 15:32     OnTouch узнать цвет пикселя
Ответ Создать тему
Опции темы

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