最近较流行的效果 Android自定义View实现倾斜列表/图片

先看看效果图:

实现思路:擦除图片相应的角,然后层叠图片,产生倾斜效果

代码实现:

1、定义属性

在values文件夹下的attrs文件添加以下代码

<resources> <declare-styleable name="TiltView"> <attr name="type" format="integer" /> </declare-styleable> </resources>

2、自定义布局

public class TiltView extends ImageView { private int imageWidth;//图片宽度 private int imageHeight;//图片高度 private double angle = 10 * Math.PI / 180;//三角形角度 private int triangleHeight;//三角形高度 private Paint paint;//画笔 private Path path;//绘制路径 private int type;//倾斜图片的类型 public TiltView(Context context) { this(context, null); } public TiltView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TiltView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TiltView); type = array.getInteger(R.styleable.TiltView_type, 1); array.recycle(); } //重测大小 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); imageWidth = measureSpec(widthMeasureSpec); imageHeight = measureSpec(heightMeasureSpec); setMeasuredDimension(imageWidth, imageHeight); //设置View的大小 triangleHeight = (int) (Math.abs(Math.tan(angle) * imageHeight)); } //测量长度 private int measureSpec(int measureSpec) { int minLength = 200; int mode = MeasureSpec.getMode(measureSpec); int length = MeasureSpec.getSize(measureSpec); if (mode == MeasureSpec.AT_MOST) { length = Math.min(length, minLength); } return length; } @Override protected void onDraw(Canvas canvas) { initPaint(); Bitmap mBitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888); //初始化Bitmap Canvas mCanvas = new Canvas(mBitmap);//创建画布,并绘制mBitmap Bitmap mBackBitmap = ((BitmapDrawable) getDrawable()).getBitmap(); mCanvas.drawBitmap(resizeBitmap(mBackBitmap), 0, 0, null);//绘制Bitmap setTriangle(); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); mCanvas.drawPath(path, paint); canvas.drawBitmap(mBitmap, 0, 0, null); } //初始化画笔 private void initPaint() { paint = new Paint(); paint.setDither(true);//设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰 paint.setAntiAlias(true);//设置抗锯齿 paint.setStrokeWidth(5); paint.setStyle(Paint.Style.FILL); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStrokeJoin(Paint.Join.ROUND);//圆角 } //设置三角形区域 private void setTriangle() { path = new Path(); switch (type) { case 1://右下角 path.moveTo(0, imageHeight); path.lineTo(imageWidth, imageHeight); path.lineTo(imageWidth, imageHeight - triangleHeight); path.lineTo(0, imageHeight); break; case 2://左上角+左下角 path.moveTo(0, triangleHeight); path.lineTo(imageWidth, 0); path.lineTo(0, 0); path.lineTo(0, imageHeight); path.lineTo(imageWidth, imageHeight); path.lineTo(0, imageHeight - triangleHeight); break; case 3://右上角+右下角 path.moveTo(imageWidth, triangleHeight); path.lineTo(0, 0); path.lineTo(imageWidth, 0); path.lineTo(imageWidth, imageHeight); path.lineTo(0, imageHeight); path.lineTo(imageWidth, imageHeight - triangleHeight); break; case 4://右上角 path.moveTo(0, 0); path.lineTo(imageWidth, 0); path.lineTo(imageWidth, triangleHeight); path.lineTo(0, 0); break; case 5://左上角 path.moveTo(0, 0); path.lineTo(imageWidth, 0); path.lineTo(0, triangleHeight); path.lineTo(0, 0); break; } } //重新调节图片大小 private Bitmap resizeBitmap(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); // 设置想要的大小 int newWidth = imageWidth; int newHeight = imageHeight; // 计算缩放比例 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 取得想要缩放的matrix参数 Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // 得到新的图片 return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); } }

3、布局代码调用

//其中android:layout_marginTop="-15dp"对效果实现有很大的作用 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.pengkv.may.widget.TiltView android:layout_width="match_parent" android:layout_height="100dp" android:src="@drawable/sample_0" app:type="1" /> <com.pengkv.may.widget.TiltView android:layout_width="match_parent" android:layout_height="100dp" android:layout_marginTop="-15dp" android:src="@drawable/sample_1" app:type="2" /> <com.pengkv.may.widget.TiltView android:layout_width="match_parent" android:layout_height="100dp" android:layout_marginTop="-15dp" android:src="@drawable/sample_2" app:type="4" /> </LinearLayout>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-23 16:00:13

最近较流行的效果 Android自定义View实现倾斜列表/图片的相关文章

最近较流行的效果 Android自定义View实现倾斜列表/图片_Android

先看看效果图: 实现思路:擦除图片相应的角,然后层叠图片,产生倾斜效果 代码实现: 1.定义属性 在values文件夹下的attrs文件添加以下代码 <resources> <declare-styleable name="TiltView"> <attr name="type" format="integer" /> </declare-styleable> </resources>

Android自定义View加载gif图片的例子

申明:本博客无图无真相,但是我亲测可以加载出来,假设出现只能加载一帧的情况,请在布局中加:  代码如下 复制代码 android:layerType="software"  下面是自定义View的代码:    代码如下 复制代码 package cn.zmit.foot.listviewfoot;   import android.annotation.SuppressLint; import android.content.Context; import android.graphi

Android自定义View基础开发之图片加载进度条_Android

学会了Paint,Canvas的基本用法之后,我们就可以动手开始实践了,先写个简单的图片加载进度条看看. 按照惯例,先看效果图,再决定要不要往下看: 既然看到这里了,应该是想了解这个图片加载进度条了,我们先看具体用法,再看自定义View的实现: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.co

Android自定义View之仿vivo i管家病毒扫描动画效果

技术是永无止境的,如果真的爱技术,那就勇敢的坚持下去.我很喜欢这句话,当我在遇到问题的时候.当我觉得代码枯燥的时候,我就会问自己,到底是不是真的热爱技术,这个时候,我心里总是起着波澜,我的答案是肯定的,我深深的爱着这门技术. 今天我们继续聊聊Android的自定义View系列.先看看效果吧: 这个是我手机杀毒软件的一个动画效果,类似于雷达搜索,所以用途还是很广泛的,特别是先了解一下这里的具体逻辑和写法,对技术的进步一定很有用. 先简单的分析一下这里的元素,主要有四个圆.一个扇形.还有八条虚线.当

Android自定义View之实现理财类APP七日年化收益折线图效果

这段时间的自定义View学习,学会了绘制柱状图.绘制折线图.绘制进度控件,那我们今天就来聊聊另外一种自定义的View,这就是我们常见的七日年化收益折线图效果.先看看长什么样. 这就是效果图了,元素相对而言还是比较多的,这里有线.柱状图.文字.折线.点等等.看起来好像很复杂,但是呢,只要一步一步的实现,那还是可以达到这种效果的,之前我们说过的, 自定义View,就像是在photo shop里面画图,想要什么就画什么,我们可以有很多的画笔工具,也可以有很多的图层. 先看看我们这一次用到哪些变量. P

Android 自定义view实现水波纹效果

http://blog.csdn.net/tianjian4592/article/details/44222565 在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果,兴致高昂的来找你,看了之后目的很明确,当然就是希望你能给她: 在这样的关键时候,身子板就一定得硬了,可千万别说不行,爷们儿怎么能说不行呢: 好了,为了让大家都能给妹纸们想要的,后面会逐渐分享一些比较比较不错的效果,目的只有一个,通过自定义view实现我们所能实现的动效: 今天主要分

Android自定义VIew实现卫星菜单效果浅析_Android

 一 概述: 最近一直致力于Android自定义VIew的学习,主要在看<android群英传>,还有CSDN博客鸿洋大神和wing大神的一些文章,写的很详细,自己心血来潮,学着写了个实现了类似卫星效果的一个自定义的View,分享到博客上,望各位指点一二.写的比较粗糙,见谅.(因为是在Linux系统下写的,效果图我直接用手机拍的,难看,大家讲究下就看个效果,勿喷). 先来看个效果图,有点不忍直视: 自定义VIew准备: (1)创建继承自View的类; (2)重写构造函数; (3)定义属性. (

Android自定义View实现水面上涨效果_Android

实现效果如下: 实现思路: 1.如何实现圆中水面上涨效果:利用Paint的setXfermode属性为PorterDuff.Mode.SRC_IN画出进度所在的矩形与圆的交集实现 2.如何水波纹效果:利用贝塞尔曲线,动态改变波峰值,实现"随着进度的增加,水波纹逐渐变小的效果" 话不多说,看代码. 首先是自定义属性值,有哪些可自定义属性值呢? 圆的背景颜色:circle_color,进度的颜色:progress_color,进度显示文字的颜色:text_color,进度文字的大小:tex

Android自定义View仿微博运动积分动画效果_Android

自定义View一直是自己的短板,趁着公司项目不紧张的时候,多加强这方面的练习.这一系列文章主要记录自己在自定义View的学习过程中的心得与体会. 刷微博的时候,发现微博运动界面,运动积分的显示有一个很好看的动画效果.OK,就从这个开始我的自定义view之路! 看一下最后的效果图: 分数颜色,分数大小,外圆的颜色,圆弧的颜色都支持自己设置,整体还是和微博那个挺像的.一起看看自定义View是怎样一步一步实现的: 1.自定义view的属性: 在res/values/ 下建立一个attrs.xml ,