2014-12-17 5 views
2

enter image description hereшестиугольная ImageView Закругленные углы

Привет Я хочу, закругленные углы, как показано на картинке. Мне удалось создать шестиугольный ImageView. Но я не могу обогнуть углы. Пожалуйста помоги. Я копирую код здесь, если кто-то хочет взглянуть. Я попытался дать дугу, которая используется в овальном ImageView, но не работает. Я новичок в андроиде. Любая помощь будет высоко оценена.

public class HexagonImageView extends ImageView { 

private Path hexagonPath; 
private Path hexagonBorderPath; 
private float radius; 
private Bitmap image; 
private int viewWidth; 
private int viewHeight; 
private Paint paint; 
private BitmapShader shader; 
private Paint paintBorder; 
private int borderWidth = 5; 

public HexagonImageView(Context context) { 
    super(context); 
    setup(); 
} 

public HexagonImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setup(); 
} 

public HexagonImageView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    setup(); 
} 

private void setup() { 
    paint = new Paint(); 
    paint.setAntiAlias(true); 

    paintBorder = new Paint(); 
    setBorderColor(Color.WHITE); 
    paintBorder.setAntiAlias(true); 
    this.setLayerType(LAYER_TYPE_SOFTWARE, paintBorder); 
    paintBorder.setShadowLayer(4.0f, 1.0f, 1.0f, Color.BLACK); 

    hexagonPath = new Path(); 
    hexagonBorderPath = new Path(); 

} 

public void setRadius(float r) { 
    this.radius = r; 
    calculatePath(); 
    this.invalidate(); 
} 

public void setBorderWidth(int borderWidth) { 
    this.borderWidth = borderWidth; 
    this.invalidate(); 
} 

public void setBorderColor(int borderColor) { 
    if (paintBorder != null) 
     paintBorder.setColor(borderColor); 

    this.invalidate(); 
} 

private void calculatePath() { 

    float triangleHeight = (float) (Math.sqrt(3) * radius/2); 
    float centerX = viewWidth/2; 
    float centerY = viewHeight/2; 

    hexagonBorderPath.moveTo(centerX, centerY + radius); 
    hexagonBorderPath.lineTo(centerX - triangleHeight, centerY + radius/2); 
    hexagonBorderPath.lineTo(centerX - triangleHeight, centerY - radius/2); 
    hexagonBorderPath.lineTo(centerX, centerY - radius); 
    hexagonBorderPath.lineTo(centerX + triangleHeight, centerY - radius/2); 
    hexagonBorderPath.lineTo(centerX + triangleHeight, centerY + radius/2); 
    hexagonBorderPath.moveTo(centerX, centerY + radius); 

    float radiusBorder = radius - borderWidth;  
    float triangleBorderHeight = (float) (Math.sqrt(3) * radiusBorder/2); 

    hexagonPath.moveTo(centerX, centerY + radiusBorder); 
    hexagonPath.lineTo(centerX - triangleBorderHeight, centerY + radiusBorder/2); 
    hexagonPath.lineTo(centerX - triangleBorderHeight, centerY - radiusBorder/2); 
    hexagonPath.lineTo(centerX, centerY - radiusBorder); 
    hexagonPath.lineTo(centerX + triangleBorderHeight, centerY - radiusBorder/2); 
    hexagonPath.lineTo(centerX + triangleBorderHeight, centerY + radiusBorder/2); 
    hexagonPath.moveTo(centerX, centerY + radiusBorder); 

    this.invalidate(); 
} 

private void loadBitmap() { 
    BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable(); 

    if (bitmapDrawable != null) 
     image = bitmapDrawable.getBitmap(); 
} 

@SuppressLint("DrawAllocation") 
@Override 
public void onDraw(Canvas canvas){ 
    super.onDraw(canvas); 

    loadBitmap(); 

    // init shader 
    if (image != null) { 

     canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 

     shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvas.getWidth(), canvas.getHeight(), true), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 
     paint.setShader(shader); 

     canvas.drawPath(hexagonBorderPath, paintBorder); 
     canvas.drawPath(hexagonPath, paint); 
     canvas.clipPath(hexagonPath, Region.Op.DIFFERENCE); 
    } 

} 

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    int width = measureWidth(widthMeasureSpec); 
    int height = measureHeight(heightMeasureSpec, widthMeasureSpec); 

    viewWidth = width - (borderWidth * 2); 
    viewHeight = height - (borderWidth * 2); 

    radius = height/2 - borderWidth; 

    calculatePath(); 

    setMeasuredDimension(width, height); 
} 

private int measureWidth(int measureSpec) { 
    int result = 0; 
    int specMode = MeasureSpec.getMode(measureSpec); 
    int specSize = MeasureSpec.getSize(measureSpec); 

    if (specMode == MeasureSpec.EXACTLY) { 
     result = specSize; 
    } 
    else { 
     result = viewWidth; 
    } 

    return result; 
} 

private int measureHeight(int measureSpecHeight, int measureSpecWidth) { 
    int result = 0; 
    int specMode = MeasureSpec.getMode(measureSpecHeight); 
    int specSize = MeasureSpec.getSize(measureSpecHeight); 

    if (specMode == MeasureSpec.EXACTLY) { 
     result = specSize; 
    } 
    else { 
     result = viewHeight; 
    } 

    return result; 
} 
} 

ответ

1

Вы должны заменить hexagonPath.lineTo команды с hexagonPath.cubicTo или hexagonPath.quadTo. Лично я считаю, что последнее легко работать. Как и ваши линии, оба рисуют из последней точки, но, соответственно, они позволяют вам указывать координаты для 2 или 1 контрольных точек плюс точку назначения. Контрольные точки вызовут эффект поклонения между точками сюжета.

Если это звучит как слишком много работы (это проще, чем кажется), есть библиотека для вашего точного требования, указанная в this answer.

+0

Hi @jason Я все еще придерживаюсь этого. Я много пробовал, но ничего не работает. Не могли бы вы помочь мне. Не могли бы вы сделать один закругленный угол, чтобы я мог сделать все остальное. Спасибо –

+0

@RahulSood ... у вас есть ур и? –

+0

@AndroidDeveleoper Нет человека ... –

1

я использовал this

и я сделал так, как yours.just изменить радиус угла и угол, чтобы получить то, что вы хотите.