31 / 31 / 3
Регистрация: 26.06.2012
Сообщений: 166
1

Элемент нестандартной формы

01.07.2012, 01:40. Показов 3074. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос в следующем: есть необходимость создания круглого (или другой формы элемента), внутри которого помещается изображение. Думал как-то надо унаследовать от ImageView, но там нет публичных методов для переопределения. Подскажите в каком направлении мыслить или пример покажите.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2012, 01:40
Ответы с готовыми решениями:

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

Кнопки нестандартной формы
Подскажите, как можно сделать

Окно нестандартной формы!
Здравствуйте, интернет весь перекопан, надеюсь на вашу помощь! Возможно ли сделать окно не простой...

Кнопка нестандартной формы
Может кто-то сталкивался в версткой такой или похожей кнопки? Или просто видел что-то похожее...

9
31 / 31 / 0
Регистрация: 05.11.2011
Сообщений: 178
01.07.2012, 01:43 2
а в чем проблема сделать элемент квадратной формы с прозрачным фоном, а уже внутри изображение нужной? опишите суть, что необходимо.
0
31 / 31 / 3
Регистрация: 26.06.2012
Сообщений: 166
01.07.2012, 02:53  [ТС] 3
Нужно, чтобы любое изображение, выбранное в качестве ресурса становилось круглым (или еще каким-нибудь)
0
31 / 31 / 0
Регистрация: 05.11.2011
Сообщений: 178
01.07.2012, 02:59 4
обрезаем края в методе onDraw так как нам надо - и все... onDraw есть у любого view.
0
31 / 31 / 3
Регистрация: 26.06.2012
Сообщений: 166
01.07.2012, 03:04  [ТС] 5
Если можно - ткните меня носом в пример...
0
31 / 31 / 0
Регистрация: 05.11.2011
Сообщений: 178
01.07.2012, 13:40 6
Толкового примера не дам, но вот пример кода(не факт что рабочий, но суть поймете.)
Java
1
2
3
4
5
6
7
8
9
10
11
@Override
protected void onDraw(Canvas canvas) {
Path path = new Path();
path.moveTo(w/2,h/2);
path.lineTo(fX,fY);
path.addArc(rectF, startAngle, (float)angle);
path.lineTo(w/2,h/2);
path.close();
canvas.clipPath(path);
 
}
после данных манипуляций у вас останется только то, что внутри вырезанного пути.
0
31 / 31 / 3
Регистрация: 26.06.2012
Сообщений: 166
02.07.2012, 02:38  [ТС] 7
Создал такой класс
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
public class CircleView extends View {
 
    public CircleView(Context context) {
        super(context);
    }
    
    public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    public CircleView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    
    
    @Override
    protected void onDraw(Canvas canvas) {
        //super.onDraw(canvas);
        Path path = new Path();
        int h=canvas.getHeight();
        int w=canvas.getWidth();
        int r=h;
        path.addCircle(w, h, r, Path.Direction.CW);
        canvas.clipPath(path);
 
    }
 
}
Создал разметку
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <com.tests.hor.CircleView
        android:id="@+id/single_picture"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/lev"
        />
    
 
</LinearLayout>
Написал активити
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.tests.hor;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
 
public class HorActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.one_picture);
        CircleView onePicture=(CircleView)findViewById(R.id.single_picture);
        onePicture.invalidate();
       
            } 
    }
}
Бэкграунд рисует, больше ничего не делает.

В документации по классу View написано, что параметр canvas, передаваемый в метод OnDraw - это холст на котором рисуется бекграунд. Соответственно, чтобы вывести на экран обрезанное изображение я должен обрезать этот cavas методом canvas.clippath(path). Что я делаю не так?
0
31 / 31 / 0
Регистрация: 05.11.2011
Сообщений: 178
02.07.2012, 07:25 8
после того как канвас обрезали, надо на нем что либо нарисовать... вот еще кусок кода, забыл к прошлому прилепить:
Java
1
2
3
4
Paint paint = new Paint();
paint.setFilterBitmap(true);
 
canvas.drawBitmap(bitmap, w, h, paint);
1
31 / 31 / 3
Регистрация: 26.06.2012
Сообщений: 166
03.07.2012, 01:23  [ТС] 9
Метод OnDraw переопределил так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
protected void onDraw(Canvas canvas) {
        Path path = new Path();
        int h=canvas.getHeight();
        int w=canvas.getWidth();
        float r=w/2-10;
        path.addCircle(w/2, h/2, r, Path.Direction.CW);
        canvas.clipPath(path);
        Resources res=getResources();
        Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);
        BitmapDrawable bd=(BitmapDrawable)res.getDrawable(R.drawable.deva);
        Bitmap bitmap=bd.getBitmap();
        float x1=w/2-r;
        float x2=w/2+r;
        float y1=h/2-r;
        float y2=h/2+r;
        RectF dst=new RectF(x1,y1,x2,y2);
        canvas.drawBitmap(bitmap,null,dst,paint);
 
    }
Теперь рисуется впринципе как задумывалось. Правда есть у меня сомнения по поводу того, что как-то коряво я достаю битмэп из ресурса, но это лирика....
И еще - бекграунд для элемента надо убирать - он рисуется полюбас фоном переопределять onDraw или нет и на canvas особо не смотрит.

А данная запись на родном сайте ввела меня в заблуждение:

protected void onDraw (Canvas canvas)
Since: API Level 1

Implement this to do your drawing.
Parameters:
canvas - the canvas on which the background will be drawn

или же я что-то недопонял?
0
31 / 31 / 0
Регистрация: 05.11.2011
Сообщений: 178
03.07.2012, 02:02 10
тут не надо понимать)) просто рисуйте.
0
03.07.2012, 02:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2012, 02:02
Помогаю со студенческими работами здесь

PictureBox нестандартной формы
Доброго времени суток дорогие форумчане, пишу проект игрового лаунчера, и вот мне надо сделать...

Кнопка нестандартной формы
Здравствуйте! Подскажите пожалуйста, как сделать кнопку в виде картинки? То есть, вставить...

Кнопка нестандартной формы
Нужно создать кнопку нестандартной формы, как показано на картинке. Собственно, технически это...

Кнопка нестандартной формы
Нужно создать кнопку нестандартной формы, как показано на картинке. Собственно, технически это...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru