Android 自定义正方形控件 最终不是正方形

Tan_yixiu 2015-01-26 12:20:57
最近想写一个正方形控件,代码如下:

package com.tanyixiu.memo.widget;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;

public class RoundImageView extends ImageView {

public RoundImageView(Context context) {
super(context);
}

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

public RoundImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int wSize = MeasureSpec.getSize(widthMeasureSpec);
int hSize = MeasureSpec.getSize(heightMeasureSpec);
int min = Math.min(wSize, hSize);
setMeasuredDimension(min, min);
Log.v("tanyixiu", "wSize=" + wSize + ";hSize="+hSize);
}

@Override
protected void onDraw(Canvas canvas) {
Drawable d = getDrawable();
if (null == d || !(d instanceof BitmapDrawable)) {
super.onDraw(canvas);
return;
}
int wCanvas = getWidth();
int hCanvas = getHeight();
if (wCanvas != hCanvas) {
float minCanvas = Math.min(wCanvas, hCanvas);
canvas.translate((wCanvas - minCanvas) / 2, (hCanvas - minCanvas) / 2);
}
ShapeDrawable shape = getRoundShapeDrawable((BitmapDrawable) d);
shape.draw(canvas);
}

private ShapeDrawable getRoundShapeDrawable(BitmapDrawable d) {
ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
Bitmap bitmap = getBitmap(d);
BitmapShader bitmapShader = new BitmapShader(bitmap, TileMode.MIRROR, TileMode.MIRROR);
shapeDrawable.getPaint().setShader(bitmapShader);
int min = Math.min(getWidth(), getHeight());
shapeDrawable.setBounds(0, 0, min, min);
return shapeDrawable;
}

private Bitmap getBitmap(BitmapDrawable d) {
Bitmap source = d.getBitmap();
int sourceW = source.getWidth();
int sourceH = source.getHeight();
Bitmap squear = null;
if (sourceW != sourceH) {
int min = Math.min(sourceW, sourceH);
squear = Bitmap.createBitmap(source, (sourceW - min) / 2, (sourceH - min) / 2, min, min);
} else {
squear = source;
}

int minCanvas = Math.min(getWidth(), getHeight());
int minBitmap = Math.min(squear.getWidth(), squear.getHeight());
float rate = minCanvas / (float) minBitmap;
Matrix matrix = new Matrix();
matrix.setScale(rate, rate);

Bitmap result = Bitmap.createBitmap(squear, 0, 0, squear.getWidth(), squear.getHeight(), matrix, true);
return result;
}
}



xml调用代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >

<com.tanyixiu.memo.widget.RoundImageView
android:id="@+id/main_roundImg"
android:layout_width="200dp"
android:layout_height="100dp"
android:background="#FFF000"
android:src="@drawable/headphoto" >
</com.tanyixiu.memo.widget.RoundImageView>

</RelativeLayout>


打印日志如下:


运行效果如下:


问题来了:
为什么黄色部分还是长方形的,不是正方形的呢?
...全文
535 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
开发者_android 2015-01-30
  • 打赏
  • 举报
回复
引用 5 楼 Tan_yixiu 的回复:
[quote=引用 4 楼 dalor 的回复:] [quote=引用 3 楼 Tan_yixiu 的回复:] [quote=引用 2 楼 zyc13701469860 的回复:] 你只把图片bitmap绘制成正方形,外面的控件宽高还是200*100 android:layout_width="200dp" android:layout_height="100dp"
但是如果我设置成这样就可以化成正方形的 android:layout_width="100dp" android:layout_height="200dp" [/quote] 那应该不是你设置的,因为图片本身有一定的高度在那,所以,觉得是个正文形,其实,一看你自己设置的参数就应该明白不是你设置宽高得来的正方形啊。[/quote] 图片已经被我裁剪成了正方形了,只是这个画布还不是正方形,不晓得为什么[/quote] 设置画布大小和图片大小一致。
Tan_yixiu 2015-01-30
  • 打赏
  • 举报
回复
引用 4 楼 dalor 的回复:
[quote=引用 3 楼 Tan_yixiu 的回复:] [quote=引用 2 楼 zyc13701469860 的回复:] 你只把图片bitmap绘制成正方形,外面的控件宽高还是200*100 android:layout_width="200dp" android:layout_height="100dp"
但是如果我设置成这样就可以化成正方形的 android:layout_width="100dp" android:layout_height="200dp" [/quote] 那应该不是你设置的,因为图片本身有一定的高度在那,所以,觉得是个正文形,其实,一看你自己设置的参数就应该明白不是你设置宽高得来的正方形啊。[/quote] 图片已经被我裁剪成了正方形了,只是这个画布还不是正方形,不晓得为什么
开发者_android 2015-01-27
  • 打赏
  • 举报
回复
引用 3 楼 Tan_yixiu 的回复:
[quote=引用 2 楼 zyc13701469860 的回复:] 你只把图片bitmap绘制成正方形,外面的控件宽高还是200*100 android:layout_width="200dp" android:layout_height="100dp"
但是如果我设置成这样就可以化成正方形的 android:layout_width="100dp" android:layout_height="200dp" [/quote] 那应该不是你设置的,因为图片本身有一定的高度在那,所以,觉得是个正文形,其实,一看你自己设置的参数就应该明白不是你设置宽高得来的正方形啊。
Tan_yixiu 2015-01-27
  • 打赏
  • 举报
回复
引用 2 楼 zyc13701469860 的回复:
你只把图片bitmap绘制成正方形,外面的控件宽高还是200*100 android:layout_width="200dp" android:layout_height="100dp"
但是如果我设置成这样就可以化成正方形的 android:layout_width="100dp" android:layout_height="200dp"
Mourinho 2015-01-26
  • 打赏
  • 举报
回复
你只把图片bitmap绘制成正方形,外面的控件宽高还是200*100 android:layout_width="200dp" android:layout_height="100dp"

80,352

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧