Repository: vivian8725118/CardView
Branch: master
Commit: cdb7681d5745
Files: 50
Total size: 81.0 KB
Directory structure:
gitextract_zrmng5pq/
├── .gitignore
├── .idea/
│ ├── compiler.xml
│ ├── copyright/
│ │ └── profiles_settings.xml
│ ├── dictionaries/
│ │ └── vivian.xml
│ ├── encodings.xml
│ ├── gradle.xml
│ ├── inspectionProfiles/
│ │ ├── Project_Default.xml
│ │ └── profiles_settings.xml
│ ├── misc.xml
│ ├── modules.xml
│ ├── runConfigurations.xml
│ └── vcs.xml
├── README.md
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── vivian/
│ │ └── shadedemo/
│ │ └── ExampleInstrumentedTest.java
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── vivian/
│ │ │ └── shadedemo/
│ │ │ ├── MainActivity.java
│ │ │ ├── adapter/
│ │ │ │ └── CardViewAdapter.java
│ │ │ ├── anim/
│ │ │ │ └── RecyclerViewItemAnimator.java
│ │ │ ├── drawable/
│ │ │ │ ├── BottomDrawable.java
│ │ │ │ ├── CenterDrawable.java
│ │ │ │ ├── CircleShadowDrawable.java
│ │ │ │ └── TopDrawable.java
│ │ │ ├── entity/
│ │ │ │ └── Card.java
│ │ │ ├── util/
│ │ │ │ ├── CardThemeUtil.java
│ │ │ │ ├── ScreenShotUtil.java
│ │ │ │ └── ScreenSizeUtil.java
│ │ │ ├── view/
│ │ │ │ ├── ShadowView.java
│ │ │ │ └── TopShadowView.java
│ │ │ └── widget/
│ │ │ └── CardView.java
│ │ └── res/
│ │ ├── drawable/
│ │ │ ├── circle.xml
│ │ │ └── circle_retangle.xml
│ │ ├── layout/
│ │ │ ├── activity_main_recyclerview.xml
│ │ │ ├── card.xml
│ │ │ └── icons.xml
│ │ ├── values/
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── values-w820dp/
│ │ └── dimens.xml
│ └── test/
│ └── java/
│ └── com/
│ └── vivian/
│ └── shadedemo/
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild
================================================
FILE: .idea/compiler.xml
================================================
* Created by vivian on 2016/12/1.
*/
public class CardViewAdapter extends RecyclerView.Adapter
* Created by vivian on 2016/12/1.
*/
public class RecyclerViewItemAnimator extends RecyclerView.ItemAnimator{
@Override
public boolean animateDisappearance(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preLayoutInfo, @Nullable ItemHolderInfo postLayoutInfo) {
return false;
}
@Override
public boolean animateAppearance(@NonNull RecyclerView.ViewHolder viewHolder, @Nullable ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
return false;
}
@Override
public boolean animatePersistence(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
return false;
}
@Override
public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder, @NonNull RecyclerView.ViewHolder newHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
return false;
}
@Override
public void runPendingAnimations() {
}
@Override
public void endAnimation(RecyclerView.ViewHolder item) {
}
@Override
public void endAnimations() {
}
@Override
public boolean isRunning() {
return false;
}
}
================================================
FILE: app/src/main/java/com/vivian/shadedemo/drawable/BottomDrawable.java
================================================
package com.vivian.shadedemo.drawable;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
/**
* * _ _
* * __ _(_)_ _(_) __ _ _ __
* * \ \ / / \ \ / / |/ _` | '_ \
* * \ V /| |\ V /| | (_| | | | |
* * \_/ |_| \_/ |_|\__,_|_| |_|
*
* Created by vivian on 2016/11/30.
*/
public class BottomDrawable extends Drawable {
Paint paint;
Paint paintShadow;
Path path;
RectF rectF;
int x = 20;
int y = 0;
int color = 0x2601a3a1;
public BottomDrawable() {
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
paintShadow = new Paint();
paintShadow.setColor(Color.WHITE);
paintShadow.setAntiAlias(true);
path = new Path();
}
public void setColor(int color) {
this.color = color;
// 设定阴影(柔边, X 轴位移, Y 轴位移, 阴影颜色)
paintShadow.setShadowLayer(21, 0, 10, color & 0x26ffffff);
invalidateSelf();
}
@Override
public void draw(Canvas canvas) {
canvas.drawPath(path, paintShadow);
canvas.drawRect(x, y, getBounds().width() - x, y + 21, paint);
}
@Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
path.reset();
rectF = new RectF(x, y, bounds.width() - x, y + bounds.height() - 21);
path.addRoundRect(rectF, new float[]{0, 0, 0, 0, 10, 10, 10, 10}, Path.Direction.CW);
}
@Override
public void setAlpha(int i) {
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
================================================
FILE: app/src/main/java/com/vivian/shadedemo/drawable/CenterDrawable.java
================================================
package com.vivian.shadedemo.drawable;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathEffect;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
/**
* * _ _
* * __ _(_)_ _(_) __ _ _ __
* * \ \ / / \ \ / / |/ _` | '_ \
* * \ V /| |\ V /| | (_| | | | |
* * \_/ |_| \_/ |_|\__,_|_| |_|
*
* Created by vivian on 2016/11/30.
*/
public class CenterDrawable extends Drawable {
Paint paint;
Paint paintShadow;
Paint paintLine;
Path path;
Bitmap bitmap;
int color=0x2601a3a1;
PathEffect effects = new DashPathEffect(new float[]{ 6, 8}, 1);
public CenterDrawable(Bitmap bitmap) {
this.bitmap=bitmap;
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
paintShadow = new Paint();
paintShadow.setColor(Color.WHITE);
paintShadow.setAntiAlias(true);
path = new Path();
paintLine = new Paint();
paintLine.setColor(Color.GRAY);
paintLine.setAntiAlias(true);
paintLine.setPathEffect(effects);
paintLine.setStyle(Paint.Style.FILL);
paintLine.setStrokeWidth(1);
}
public void setColor(int color){
this.color=color;
// 设定阴影(柔边, X 轴位移, Y 轴位移, 阴影颜色)
paintShadow.setShadowLayer(21, 0, 10, color&0x26ffffff);
invalidateSelf();
}
@Override
public void onBoundsChange(Rect bounds){
int x = bounds.left + 20;
int y = bounds.top;
path.reset();
path.moveTo(x, y);
path.lineTo(bounds.right - x, y);
path.quadTo(bounds.right - x - bounds.bottom * 0.8f, bounds.bottom / 2, bounds.right - x, bounds.bottom);
path.lineTo(x, bounds.bottom);
path.quadTo(x + bounds.bottom * 0.8f, bounds.bottom / 2, x, y);
path.close();
}
@Override
public void draw(Canvas canvas) {
int x = getBounds().left + 20;
int y = getBounds().top;
//画背景
canvas.drawPath(path, paintShadow);
//画一半虚线
canvas.drawLine(x+getBounds().bottom*0.8f, getBounds().bottom/2, (getBounds().right - x - getBounds().bottom * 0.8f)/2-bitmap.getWidth(), getBounds().bottom/2, paintLine);
//画引号
canvas.drawBitmap(bitmap,getBounds().right/2-bitmap.getWidth(),y,new Paint());
//画另一半虚线
canvas.drawLine((getBounds().right - x - getBounds().bottom * 0.8f)/2+bitmap.getWidth()*3/2, getBounds().bottom/2, getBounds().right - x - getBounds().bottom * 0.8f, getBounds().bottom/2, paintLine);
}
@Override
public void setAlpha(int i) {
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
================================================
FILE: app/src/main/java/com/vivian/shadedemo/drawable/CircleShadowDrawable.java
================================================
package com.vivian.shadedemo.drawable;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import com.vivian.shadedemo.R;
/**
* * _ _
* * __ _(_)_ _(_) __ _ _ __
* * \ \ / / \ \ / / |/ _` | '_ \
* * \ V /| |\ V /| | (_| | | | |
* * \_/ |_| \_/ |_|\__,_|_| |_|
*
* Created by vivian on 2016/11/30.
*/
public class CircleShadowDrawable extends Drawable {
private Bitmap bitmap = null;
Context mContext;
// 建立Paint 物件
Paint paint3 = new Paint();
public CircleShadowDrawable(Context context){
mContext=context;
// bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.top_selector);
}
@Override
public void draw(Canvas canvas) {
paint3.setColor(Color.RED);
// 设定阴影(柔边, X 轴位移, Y 轴位移, 阴影颜色)
paint3.setShadowLayer(300, 0, 0, Color.RED);
// 实心矩形& 其阴影
canvas.drawCircle(400, 500, 300, paint3);
}
@Override
public void setAlpha(int i) {
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return 0;
}
}
================================================
FILE: app/src/main/java/com/vivian/shadedemo/drawable/TopDrawable.java
================================================
package com.vivian.shadedemo.drawable;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
/**
* * _ _
* * __ _(_)_ _(_) __ _ _ __
* * \ \ / / \ \ / / |/ _` | '_ \
* * \ V /| |\ V /| | (_| | | | |
* * \_/ |_| \_/ |_|\__,_|_| |_|
*
* Created by vivian on 2016/11/30.
*/
public class TopDrawable extends Drawable {
Paint paint;
Paint paintShadow;
Path path;
RectF rectF;
int x = 20;
int y = 20;
int color = 0x2601a3a1;
public TopDrawable() {
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
paintShadow = new Paint();
paintShadow.setColor(Color.WHITE);
paintShadow.setAntiAlias(true);
path = new Path();
}
public void setColor(int color) {
this.color = color;
// 设定阴影(柔边, X 轴位移, Y 轴位移, 阴影颜色)
paintShadow.setShadowLayer(21, 0, 10, color & 0x26ffffff);//0x2600A4A0
invalidateSelf();
}
@Override
public void draw(Canvas canvas) {
canvas.drawPath(path, paintShadow);
canvas.drawRect(x, getBounds().height(), getBounds().width() - x, getBounds().height() + 21, paint);
}
@Override
public void onBoundsChange(Rect bounds) {
path.reset();
rectF = new RectF(x, y, bounds.width() - x, bounds.height());
path.addRoundRect(rectF, new float[]{6, 6, 6, 6, 0, 0, 0, 0}, Path.Direction.CW);
}
@Override
public void setAlpha(int i) {
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
================================================
FILE: app/src/main/java/com/vivian/shadedemo/entity/Card.java
================================================
package com.vivian.shadedemo.entity;
/**
* * _ _
* * __ _(_)_ _(_) __ _ _ __
* * \ \ / / \ \ / / |/ _` | '_ \
* * \ V /| |\ V /| | (_| | | | |
* * \_/ |_| \_/ |_|\__,_|_| |_|
*
* Created by vivian on 2016/12/1.
*/
public class Card {
private String content;
private String comment = "";
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
================================================
FILE: app/src/main/java/com/vivian/shadedemo/util/CardThemeUtil.java
================================================
package com.vivian.shadedemo.util;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.util.Log;
/**
* * _ _
* * __ _(_)_ _(_) __ _ _ __
* * \ \ / / \ \ / / |/ _` | '_ \
* * \ V /| |\ V /| | (_| | | | |
* * \_/ |_| \_/ |_|\__,_|_| |_|
*
* Created by vivian on 2016/12/1.
*/
public class CardThemeUtil {
public Drawable colorMatrixFilter(Context context,int res, int color) {
int r = Color.red(color);
int g = Color.green(color);
int b = Color.blue(color);
//定义RGBA的矩阵
float[] src = new float[]{
0, 0, 0, 0, r,
0, 0, 0, 0, g,
0, 0, 0, 0, b,
0, 0, 0, 1, 0};
ColorMatrix matrix = new ColorMatrix(src);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
Drawable drawable = ContextCompat.getDrawable(context,res);
drawable.setColorFilter(filter);
return drawable;
}
/**
* Usage:很耗性能
* topLayout.setBackground(colorFilter(R.drawable.top));
* centerLayout.setBackground(colorFilter(R.drawable.center));
* bottomLayout.setBackground(colorFilter(R.drawable.bottom));
*
* @param res
* @return
*/
public Drawable colorFilter(Context context,int res) {
Drawable drawable = context.getDrawable(res);
Bitmap bitmap = drawableToBitmap(drawable);
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int color = bitmap.getPixel(x, y);
if (color != 0xffffffff) {
Log.e("color:", "alpha:" + Color.alpha(color));
Log.e("color:", "red:" + Color.red(color));
Log.e("color:", "green:" + Color.green(color));
Log.e("color:", "blue:" + Color.blue(color) + "\n");
int alpha = Color.alpha(color);
int color2 = Color.argb(alpha, 249, 39, 54);
pixels[y * width + x] = color2;
} else {
pixels[y * width + x] = 0xffffffff;
}
}
}
bitmap = Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_4444);
Drawable d = new BitmapDrawable(context.getResources(), bitmap);
return d;
}
public static Bitmap drawableToBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
}
================================================
FILE: app/src/main/java/com/vivian/shadedemo/util/ScreenShotUtil.java
================================================
package com.vivian.shadedemo.util;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.ViewGroup;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
/**
* * _ _
* * __ _(_)_ _(_) __ _ _ __
* * \ \ / / \ \ / / |/ _` | '_ \
* * \ V /| |\ V /| | (_| | | | |
* * \_/ |_| \_/ |_|\__,_|_| |_|
*
* Created by vivian on 2016/12/1.
*/
public class ScreenShotUtil {
/**
* 截图
*
* @param view
* @return
*/
public static Bitmap convertViewToBitmap(View view) {
view.setDrawingCacheEnabled(true);
view.buildDrawingCache(); //启用DrawingCache并创建位图
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); //创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收
view.setDrawingCacheEnabled(false); //禁用DrawingCahce否则会影响性能
view.destroyDrawingCache();
return bitmap;
}
/**
* 截取长图
*
* @param view
* @return
*/
public static Bitmap getScrollViewBitmap(ViewGroup view) {
int h = 0;
for (int i = 0; i < view.getChildCount(); i++) {
h += view.getChildAt(i).getHeight();
}
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), h, Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
return bitmap;
}
/**
* 保存到本地图库
*
* @param context
* @param bitmap
*/
public static void saveImageToGallery(Context context, Bitmap bitmap) {
// Create screenshot directory if it doesn't exist
String dirName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + "TMT";
File fileDir = new File(dirName);
if (!fileDir.exists()) {
fileDir.mkdir();
}
long mImageTime = System.currentTimeMillis();//取当前系统时间
// media provider uses seconds for DATE_MODIFIED and DATE_ADDED, but milliseconds
// for DATE_TAKEN
long dateSeconds = mImageTime / 1000;
String mImageFileName = dateSeconds + ".png"; //以保存时间命名
String mImageFilePath = dirName + File.separator + mImageFileName; //注意这里的mImageFilePath是: 目录名称+文件名
int mImageWidth = bitmap.getWidth();
int mImageHeight = bitmap.getHeight();
// Save the screenshot to the MediaStore
ContentValues values = new ContentValues();
ContentResolver resolver = context.getContentResolver();
values.put(MediaStore.Images.ImageColumns.DATA, mImageFilePath);
values.put(MediaStore.Images.ImageColumns.TITLE, mImageFileName);
values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, mImageFileName);
values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, mImageTime);
values.put(MediaStore.Images.ImageColumns.DATE_ADDED, dateSeconds);
values.put(MediaStore.Images.ImageColumns.DATE_MODIFIED, dateSeconds);
values.put(MediaStore.Images.ImageColumns.MIME_TYPE, "image/png");
values.put(MediaStore.Images.ImageColumns.WIDTH, mImageWidth);
values.put(MediaStore.Images.ImageColumns.HEIGHT, mImageHeight);
Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
try {
OutputStream out = resolver.openOutputStream(uri);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// update file size in the database
values.clear();
values.put(MediaStore.Images.ImageColumns.SIZE, new File(mImageFilePath).length());
resolver.update(uri, values, null, null);
}
}
================================================
FILE: app/src/main/java/com/vivian/shadedemo/util/ScreenSizeUtil.java
================================================
package com.vivian.shadedemo.util;
import android.app.Activity;
import android.content.Context;
import android.util.DisplayMetrics;
import android.util.TypedValue;
public class ScreenSizeUtil {
private static DisplayMetrics metrics;
/**
* 根据绝对尺寸得到相对尺寸,在不同的分辨率设备上有一致的显示效果, dip->pix
*
* @param context
* @param givenAbsSize
* 绝对尺寸
* @return
*/
public static int getSizeByGivenAbsSize(Context context, int givenAbsSize) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, givenAbsSize, context.getResources().getDisplayMetrics());
}
private static DisplayMetrics getDisplayMetrics(Context context) {
if (metrics != null) {
return metrics;
}
metrics = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(metrics);
return metrics;
}
public static int getScreenWidth(Context context) {
return getDisplayMetrics(context).widthPixels; // 屏幕宽度(像素)
}
public static int getScreenHeight(Context context) {
return getDisplayMetrics(context).heightPixels;// 屏幕高度(像素)
}
public static float getScreenDensity(Context context) {
return getDisplayMetrics(context).density; // 屏幕密度(0.75 / 1.0 / 1.5)
}
public static int getScreenDensityDpi(Context context) {
return getDisplayMetrics(context).densityDpi;// 屏幕密度DPI(120 / 160 / 240)
}
public static int Dp2Px(Context context, float dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
public static int Px2Dp(Context context, float px) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (px / scale + 0.5f);
}
/**
* 将px值转换为sp值,保证文字大小不变
*
* @param pxValue
* @return
*/
public static int px2sp(float pxValue, Context context) {
return (int) (pxValue / context.getResources().getDisplayMetrics().scaledDensity + 0.5f);
}
/**
* 将sp值转换为px值,保证文字大小不变
*
* @param spValue
* @return
*/
public static int sp2px(float spValue, Context context) {
return (int) (spValue * context.getResources().getDisplayMetrics().scaledDensity + 0.5f);
}
}
================================================
FILE: app/src/main/java/com/vivian/shadedemo/view/ShadowView.java
================================================
package com.vivian.shadedemo.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
/**
* * _ _
* * __ _(_)_ _(_) __ _ _ __
* * \ \ / / \ \ / / |/ _` | '_ \
* * \ V /| |\ V /| | (_| | | | |
* * \_/ |_| \_/ |_|\__,_|_| |_|
*
* Created by vivian on 2016/11/30.
*/
public class ShadowView extends View {
// private Bitmap bitmap = null;
public ShadowView(Context context) {
super(context);
// bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.top);
setLayerType(View.LAYER_TYPE_SOFTWARE, null);//没有这句不显示
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 建立Paint 物件
Paint paint3 = new Paint();
paint3.setColor(Color.WHITE);
paint3.setAntiAlias(true);
// 设定阴影(柔边, X 轴位移, Y 轴位移, 阴影颜色)
paint3.setShadowLayer(21, 0, 10, 0x2600A4A0);
// 实心矩形& 其阴影
canvas.drawCircle(400, 500, 96, paint3);
}
}
================================================
FILE: app/src/main/java/com/vivian/shadedemo/view/TopShadowView.java
================================================
package com.vivian.shadedemo.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
/**
* * _ _
* * __ _(_)_ _(_) __ _ _ __
* * \ \ / / \ \ / / |/ _` | '_ \
* * \ V /| |\ V /| | (_| | | | |
* * \_/ |_| \_/ |_|\__,_|_| |_|
*
* Created by vivian on 2016/11/30.
*/
public class TopShadowView extends View {
int width = 400;
int height = 400;
int x=50;
int y=50;
public TopShadowView(Context context) {
super(context);
init(context);
}
public TopShadowView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public TopShadowView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
public TopShadowView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context);
}
public void init(Context context) {
setLayerType(View.LAYER_TYPE_SOFTWARE, null);//没有这句不显示
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
width=getWidth()-x*2;
height=getHeight()-y*2;
Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
// 建立Paint 物件
Paint paint3 = new Paint();
paint3.setColor(Color.WHITE);
paint3.setAntiAlias(true);
// 设定阴影(柔边, X 轴位移, Y 轴位移, 阴影颜色)
paint3.setShadowLayer(21, 0, 10, 0x2600A4A0);
// 实心矩形& 其阴影
RectF rectF = new RectF(100, 100, width, height);
Path path=new Path();
path.addRoundRect(x,y,width,height,new float[]{10,10,10,10,0,0,0,0}, Path.Direction.CW);
canvas.drawPath(path, paint3);
canvas.drawRect(x,height,width,height+21,paint);
}
}
================================================
FILE: app/src/main/java/com/vivian/shadedemo/widget/CardView.java
================================================
package com.vivian.shadedemo.widget;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.drawable.GradientDrawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.vivian.shadedemo.R;
import com.vivian.shadedemo.drawable.BottomDrawable;
import com.vivian.shadedemo.drawable.CenterDrawable;
import com.vivian.shadedemo.drawable.TopDrawable;
import com.vivian.shadedemo.util.ScreenSizeUtil;
/**
* * _ _
* * __ _(_)_ _(_) __ _ _ __
* * \ \ / / \ \ / / |/ _` | '_ \
* * \ V /| |\ V /| | (_| | | | |
* * \_/ |_| \_/ |_|\__,_|_| |_|
*
* Created by vivian on 2016/12/1.
*/
public class CardView extends LinearLayout {
RelativeLayout topLayout;
ImageView centerLayout;
TextView content;
EditText comment;
TopDrawable topDrawable;
CenterDrawable centerDrawable;
BottomDrawable bottomDrawable;
GradientDrawable myGrad;
public CardView(Context context) {
super(context);
init(context);
}
public CardView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public CardView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
public CardView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context);
}
public void init(final Context context) {
LinearLayout layout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.card, null);
layout.setLayoutParams(new LinearLayout.LayoutParams(ScreenSizeUtil.Dp2Px(getContext(), 285), LayoutParams.WRAP_CONTENT));
layout.setLayerType(View.LAYER_TYPE_SOFTWARE, null);//没有这句不显示
topLayout = (RelativeLayout) layout.findViewById(R.id.top);
centerLayout = (ImageView) layout.findViewById(R.id.center);
content = (TextView) layout.findViewById(R.id.content);
comment = (EditText) layout.findViewById(R.id.comment);
myGrad = (GradientDrawable) content.getBackground();
topDrawable = new TopDrawable();
topLayout.setBackground(topDrawable);
centerDrawable = new CenterDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.quote));
centerLayout.setBackground(centerDrawable);
bottomDrawable = new BottomDrawable();
comment.setBackground(bottomDrawable);
addView(layout);
}
public void changeTheme(final int color) {
//文字背景颜色
myGrad.setColor(color);
//顶部阴影颜色
topDrawable.setColor(color);
// 中部阴影颜色
centerDrawable.setColor(color);
// //底部阴影颜色
bottomDrawable.setColor(color);
}
@Override
public boolean hasOverlappingRendering() {
return false;
}
}
================================================
FILE: app/src/main/res/drawable/circle.xml
================================================