六边形裁剪
class XfermodeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_xfermode)
btn1.setOnClickListener {
imageview.setImageBitmap(BitmapFactory.decodeResource(resources ,R.mipmap.bg3 ))
}
btn2.setOnClickListener {
var bitmap = (imageview.drawable as BitmapDrawable).bitmap
imageview.setImageBitmap(getNewImage(bitmap))
}
}
fun getNewImage(bitmap: Bitmap):Bitmap{
var newBitmap = Bitmap.createBitmap(bitmap.width , bitmap.height , Bitmap.Config.ARGB_8888)
var canvas = Canvas(newBitmap)
canvas.translate(0f , 100f)
var paint = Paint()
var path = Path()
path.moveTo(0f , bitmap.width*0.5f)
path.lineTo(bitmap.width * 0.25f , 0f)
path.lineTo(bitmap.width * 0.75f , 0f)
path.lineTo(bitmap.width*1f , bitmap.width * 0.5f)
path.lineTo(bitmap.width*0.75f , bitmap.width * 1f)
path.lineTo(bitmap.width*0.25f , bitmap.width *1f)
path.close()
canvas.drawPath(path, paint)
paint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.SRC_IN))
var rect = Rect(0,0,bitmap.width ,bitmap.height)
canvas.drawBitmap(bitmap , null , rect , paint)
return newBitmap
}
}
原图 | 效果图 |
---|---|
六边形原图.jpg
|
六边形效果图.jpg
|
抠图 从大图上抠掉小图所占的部分
class Xfermode2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_xfermode2)
var bitmap = (imageview_bg.drawable as BitmapDrawable).bitmap
btn1.setOnClickListener {
imageview_bg.setImageBitmap(bitmap)
}
btn2.setOnClickListener {
var myWidth = bitmap.width
var myHeight = bitmap.height
var maskBitmap = BitmapFactory.decodeResource(resources ,R.mipmap.animal)
var scalMaskBitmap = Bitmap.createScaledBitmap(maskBitmap , myWidth ,myHeight,true)
var newbitmap = Bitmap.createBitmap(myWidth , myHeight ,Bitmap.Config.ARGB_8888)
var canvas = Canvas(newbitmap)
var paint = Paint()
canvas.drawBitmap(scalMaskBitmap , (0).toFloat(),
(0).toFloat() , paint)
paint.setXfermode(PorterDuffXfermode(PorterDuff.Mode.SRC_OUT))
canvas.drawBitmap(bitmap , (0 ).toFloat() ,
(0).toFloat() , paint)
imageview_bg.setImageBitmap(newbitmap)
}
}
}
原图 | 效果图 |
---|---|
抠图原图.jpg
|
抠图效果图.jpg
|
对比度
class ColormatrixActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_colormatrix)
var width = windowManager.defaultDisplay.width
// var height = (imageview.drawable as BitmapDrawable).bitmap.height
var option = BitmapFactory.Options()
option.inJustDecodeBounds = true
BitmapFactory.decodeResource(resources , R.mipmap.colormatrix, option)
var scalWidth = option.outWidth/width
var option2 = BitmapFactory.Options()
option2.inSampleSize = scalWidth;
var bitmap = BitmapFactory.decodeResource(resources , R.mipmap.colormatrix, option2)
btn1.setOnClickListener {
imageview.setImageBitmap(bitmap)
}
btn2.setOnClickListener {
var myWidth = bitmap.width
var myHeight = bitmap.height
var myMatrix = floatArrayOf(5f,0f,0f,0f,-254f,
0f,5f,0f,0f,-254f,
0f,0f,5f,0f,-254f,
0f,0f,0f,1f,0f)
var newBitmap = Bitmap.createBitmap(myWidth ,myHeight ,Bitmap.Config.ARGB_8888)
var canvas = Canvas(newBitmap)
var paint = Paint()
var colorMatrix = ColorMatrix()
colorMatrix.set(myMatrix)
paint.setColorFilter(ColorMatrixColorFilter(colorMatrix) as ColorFilter?)
canvas.drawBitmap(bitmap,0f,0f,paint)
imageview.setImageBitmap(newBitmap)
}
}
}
原图 | 效果图 |
---|---|
对比度原图.jpg
|
对比度效果图.jpg
|
颜色过滤
class ColorFliterActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_color_fliter)
btn0.setOnClickListener {
imageview.setColorFilter(null)
}
btn1.setOnClickListener {
imageview.setColorFilter(Color.GREEN , PorterDuff.Mode.MULTIPLY)
}
btn2.setOnClickListener {
imageview.setColorFilter(Color.RED , PorterDuff.Mode.MULTIPLY)
}
btn3.setOnClickListener {
imageview.setColorFilter(Color.BLUE , PorterDuff.Mode.MULTIPLY)
}
}
}
红色过滤 | 蓝色过滤 |
---|---|
红色过滤.jpg
|
蓝色过滤.jpg
|
多色渐变
class SweepGradientActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(MyView(this))
}
inner class MyView(context: Context?) : View(context) {
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
var myDisplay = windowManager.defaultDisplay
var myWidth = myDisplay.width - 200
var myHeight = myDisplay.height - 100
var mySweepGradient = SweepGradient(myWidth/2.toFloat() , myHeight/2.toFloat() ,
intArrayOf(Color.BLUE , Color.CYAN , Color.DKGRAY , Color.LTGRAY , Color.MAGENTA ,
Color.GREEN , Color.TRANSPARENT , Color.BLUE) , null)
var paint = Paint()
paint.setShader(mySweepGradient)
canvas!!.translate(100f , -100f)
canvas.drawCircle(myWidth/2.toFloat() , myHeight/2.toFloat() , myWidth/2.toFloat() , paint)
}
}
}
多色渐变.jpg
电波扩散
class RadialGradientActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(MyView(this))
}
inner class MyView: View {
var myShader : Shader
var myBitmap: Bitmap
var myPaint: Paint
var myRadialGradient: Shader? = null
lateinit var myShapeDrawable: ShapeDrawable
constructor(context: Context?):super(context){
var myBitmap = (resources.getDrawable(R.mipmap.bg1) as BitmapDrawable).bitmap
var myMetrics = resources.displayMetrics
this.myBitmap = Bitmap.createScaledBitmap(myBitmap ,myMetrics.widthPixels ,
myMetrics.heightPixels , true)
myShader = BitmapShader(myBitmap , Shader.TileMode.REPEAT , Shader.TileMode.MIRROR)
myPaint = Paint()
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
myShapeDrawable = ShapeDrawable(null)
myShapeDrawable.paint.setShader(myShader)
myShapeDrawable.setBounds(0,0,myBitmap.width ,myBitmap.height)
myShapeDrawable.draw(canvas!!)
if(myRadialGradient != null){
myPaint.setShader(myRadialGradient)
canvas.drawCircle(0f,0f,2000f,myPaint)
}
}
override fun onTouchEvent(event: MotionEvent?): Boolean {
myRadialGradient = RadialGradient(event!!.getX() , event.getY() , 48f ,
intArrayOf(Color.WHITE , Color.TRANSPARENT) , null ,Shader.TileMode.REPEAT)
postInvalidate()
return true
}
}
}
原图 | 效果图 |
---|---|
电波扩散原图.jpg
|
电波扩散效果图.jpg
|
内阴影
class ComposeShaderActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_compose_shader)
var bitmap = BitmapFactory.decodeResource(resources,R.mipmap.bg3)
btn1.setOnClickListener {
imageview_bg.setImageBitmap(bitmap)
}
btn2.setOnClickListener {
var width = bitmap.width
var height = bitmap.height
var paint = Paint()
var bitmapShader = BitmapShader(bitmap , Shader.TileMode.REPEAT ,
Shader.TileMode.REPEAT)
var radialGradient = RadialGradient(width/2.toFloat() , height/2.toFloat() ,width/2.toFloat() ,
Color.TRANSPARENT , Color.BLACK , Shader.TileMode.CLAMP)
var compeseShader = ComposeShader(bitmapShader , radialGradient , PorterDuffXfermode(PorterDuff.Mode.SRC_OVER))
paint.setShader(compeseShader)
var bimapCopy = Bitmap.createBitmap(width,height ,Bitmap.Config.ARGB_8888)
var canvas = Canvas(bimapCopy)
canvas.drawRect(0f,0f,width.toFloat(),height.toFloat(),paint)
imageview_bg.setImageBitmap(bimapCopy)
}
}
}
原图 | 效果图 |
---|---|
内阴影原图.jpg
|
内阴影效果图.jpg
|
图片切割
class ShapeDrawableActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_shape_drawable)
var drawable = getDrawable(R.mipmap.bg1)
btn1.setOnClickListener {
imageview.setImageDrawable(drawable)
}
btn2.setOnClickListener {
var bitmap = BitmapFactory.decodeResource(resources ,R.mipmap.bg1)
var path = Path()
path.moveTo(200f,100f)
path.lineTo(300f,300f)
path.lineTo(100f , 300f)
path.close()
var bitmapDrawable = ShapeDrawable(PathShape(path , drawable!!.intrinsicWidth.toFloat() ,drawable!!.intrinsicHeight.toFloat()))
var bitmapShader = BitmapShader(bitmap , Shader.TileMode.CLAMP ,Shader.TileMode.CLAMP)
bitmapDrawable.paint.setShader(bitmapShader)
imageview.setImageDrawable(bitmapDrawable)
}
}
}
原图 | 效果图 |
---|---|
图片切割原图.jpg
|
图片切割效果图.jpg
|
超大图加载
类似地图效果 不是大图缩放
整个控件当做根布局
public class LargeImageView extends View implements GestureDetector.OnGestureListener {
private static final String TAG = "LargeImageView";
private BitmapRegionDecoder mDecoder;
/**
* 绘制的区域
*/
private volatile Rect mRect = new Rect();
private int mScaledTouchSlop;
// 分别记录上次滑动的坐标
private int mLastX = 0;
private int mLastY = 0;
/**
* 图片的宽度和高度
*/
private int mImageWidth, mImageHeight;
private GestureDetector mGestureDetector;
private BitmapFactory.Options options;
public LargeImageView(Context context) {
this(context, null);
}
public LargeImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LargeImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
mScaledTouchSlop = ViewConfiguration.get(getContext())
.getScaledTouchSlop();
Log.d(TAG, "sts:" + mScaledTouchSlop);
//初始化手势控制器
mGestureDetector = new GestureDetector(context, this);
//获取图片的宽高
InputStream is = null;
try {
is = context.getResources().getAssets().open("largeimage.png");
//初始化BitmapRegionDecode,并用它来显示图片
//如果在decodeStream之前使用is,会导致出错
// 此时流的起始位置已经被移动过了,需要调用is.reset()来重置,然后再decodeStream(imgInputStream, null, options)
mDecoder = BitmapRegionDecoder
.newInstance(is, false);
BitmapFactory.Options tmpOptions = new BitmapFactory.Options();
// Grab the bounds for the scene dimensions
tmpOptions.inJustDecodeBounds = true;
is.reset();
BitmapFactory.decodeStream(is, null, tmpOptions);
mImageWidth = tmpOptions.outWidth;
mImageHeight = tmpOptions.outHeight;
Log.e(TAG, "width:" + mImageWidth + ",height:" + mImageHeight);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//把触摸事件交给手势控制器处理
return mGestureDetector.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent e) {
mLastX = (int) e.getRawX();
mLastY = (int) e.getRawY();
return true;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
int x = (int) e2.getRawX();
int y = (int) e2.getRawY();
move(x, y);
return true;
}
/**
* 移动的时候更新图片显示的区域
*
* @param x
* @param y
*/
private void move(int x, int y) {
boolean isInvalidate = false;
int deltaX = x - mLastX;
int deltaY = y - mLastY;
Log.d(TAG, "move, deltaX:" + deltaX + " deltaY:" + deltaY);
//如果图片宽度大于屏幕宽度
if (mImageWidth > getWidth()) {
//移动rect区域
mRect.offset(-deltaX, 0);
//检查是否到达图片最右端
if (mRect.right > mImageWidth) {
mRect.right = mImageWidth;
mRect.left = mImageWidth - getWidth();
}
//检查左端
if (mRect.left < 0) {
mRect.left = 0;
mRect.right = getWidth();
}
isInvalidate = true;
}
//如果图片高度大于屏幕高度
if (mImageHeight > getHeight()) {
mRect.offset(0, -deltaY);
//是否到达最底部
if (mRect.bottom > mImageHeight) {
mRect.bottom = mImageHeight;
mRect.top = mImageHeight - getHeight();
}
if (mRect.top < 0) {
mRect.top = 0;
mRect.bottom = getHeight();
}
isInvalidate = true;
}
if (isInvalidate) {
invalidate();
}
mLastX = x;
mLastY = y;
}
@Override
public void onLongPress(MotionEvent e) {
mLastX = (int) e.getRawX();
mLastY = (int) e.getRawY();
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int x = (int) e2.getRawX();
int y = (int) e2.getRawY();
move(x, y);
return true;
}
@Override
protected void onDraw(Canvas canvas) {
//显示图片
Bitmap bm = mDecoder.decodeRegion(mRect, options);
canvas.drawBitmap(bm, 0, 0, null);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMeasuredWidth();
int height = getMeasuredHeight();
int imageWidth = mImageWidth;
int imageHeight = mImageHeight;
//默认显示图片的中心区域
mRect.left = imageWidth / 2 - width / 2;
mRect.top = imageHeight / 2 - height / 2;
mRect.right = mRect.left + width;
mRect.bottom = mRect.top + height;
}
}
图片放在assets目录下
图片目录.png
超大图加载.gif