Skip to content

Commit

Permalink
v0.23 添加了一个评论图形的GraphAdapter,修改了README
Browse files Browse the repository at this point in the history
  • Loading branch information
fxzou committed Dec 5, 2016
1 parent b934308 commit 45295de
Show file tree
Hide file tree
Showing 10 changed files with 173 additions and 26 deletions.
73 changes: 69 additions & 4 deletions README.md
@@ -1,6 +1,12 @@
# 仿即刻APP点赞桃心的效果
## 2016-12-5更新
- 修改测量逻辑
- 添加了对齐方式
- 添加了一个评论图形的GraphAdapter
- 修改了已知BUG

## 先看效果图
![](img/likeview.gif)
![](img/test.gif)
## 使用方法
### 布局配置
```
Expand All @@ -15,9 +21,10 @@
### 代码配置
```java
holder.likeView.setActivated(entity.isLike);
holder.likeView.setNumber(entity.likeNum);
holder.likeView.setCallback(new LikeView.SimpleCallback() {
//点赞view的设置
holder.like.setActivated(entity.isLike);
holder.like.setNumber(entity.likeNum);
holder.like.setCallback(new LikeView.SimpleCallback() {
@Override
public void activate(LikeView view) {
Snackbar.make(view, "你觉得" + entity.name + "很赞!", Snackbar.LENGTH_SHORT).show();
Expand All @@ -28,6 +35,53 @@
Snackbar.make(view, "你取消了对" + entity.name + "的赞!", Snackbar.LENGTH_SHORT).show();
}
});
//评论view的设置
holder.comment.setNumber(entity.commentNum);
//设置图形适配器
holder.comment.setGraphAdapter(CommentPathAdapter.getInstance());
holder.comment.setCallback(new LikeView.SimpleCallback(){
@Override
public boolean onClick(LikeView view) {
Snackbar.make(view, "你点击" + entity.name + "的评论按钮", Snackbar.LENGTH_SHORT).show();
//返回true代表拦截此次点击,不使用默认的点击事件
return true;
}
});
```
### 自定义图形适配器
```java
public class CommentPathAdapter implements LikeView.GraphAdapter {
private static CommentPathAdapter instance;
private static final float xOffsetScale = 0.06f;
private static final float yOffsetScale = 0.2f;
//可用单例模式
public static CommentPathAdapter getInstance() {
synchronized (CommentPathAdapter.class) {
if (null == instance) {
instance = new CommentPathAdapter();
}
}
return instance;
}
//这里绘制你想要的图形
@Override
public Path getGraphPath(LikeView view, int length) {
Path path = new Path();
int dx = (int) (length * xOffsetScale);
int dy = (int) (length * yOffsetScale);
int w = (int) (length * (1 - xOffsetScale * 2));
int h = (int) (length * (1 - yOffsetScale * 2));
path.moveTo(dx, dy);
path.lineTo(dx + w, dy);
path.lineTo(dx + w, dy + h);
path.lineTo(dx + (w * 0.35f), dy + h);
path.lineTo(dx + (w * 0.1f), dy + (h * 1.4f));
path.lineTo(dx + (w * 0.1f), dy + h);
path.lineTo(dx, dy + h);
path.lineTo(dx, dy);
return path;
}
}
```
## 自定义配置
```
Expand Down Expand Up @@ -59,6 +113,17 @@
<attr name="autoMeasureMaxWidth" format="boolean"/>
<!--是否不允许取消点赞,默认false-->
<attr name="notAllowedCancel" format="boolean"/>
<!--对齐方式,前三种默认垂直居中-->
<attr name="gravity" format="enum">
<!--居中-->
<enum name="center" value="1"/>
<!--左对齐-->
<enum name="left" value="2"/>
<!--右对齐-->
<enum name="right" value="3"/>
<!--开始点-->
<enum name="start" value="4"/>
</attr>
</declare-styleable>
</resources>
```
Expand Down
10 changes: 6 additions & 4 deletions app/src/main/java/cn/izouxiang/likeviewdemo/MainActivity.java
Expand Up @@ -23,9 +23,11 @@ protected void onCreate(Bundle savedInstanceState) {
}
private void initData(){
ssEntities = new ArrayList<>();
ssEntities.add(new SSEntity("小明",true,100));
ssEntities.add(new SSEntity("小红",false,99));
ssEntities.add(new SSEntity("小强",true,102));
ssEntities.add(new SSEntity("小黑",false,103));
ssEntities.add(new SSEntity("小明",true,100,1));
ssEntities.add(new SSEntity("小红",false,99,0));
ssEntities.add(new SSEntity("小强",true,102,20));
ssEntities.add(new SSEntity("小黑",false,103,10));
ssEntities.add(new SSEntity("小白",false,109,5));
ssEntities.add(new SSEntity("小黑",true,110,2));
}
}
29 changes: 21 additions & 8 deletions app/src/main/java/cn/izouxiang/likeviewdemo/SSAdapter.java
Expand Up @@ -12,6 +12,7 @@

import java.util.List;

import cn.izouxiang.likeview.CommentPathAdapter;
import cn.izouxiang.likeview.LikeView;
import cn.izouxiang.likeview.R;

Expand All @@ -38,22 +39,32 @@ public SSHolder onCreateViewHolder(ViewGroup parent, int viewType) {
@Override
public void onBindViewHolder(final SSHolder holder, int position) {
final SSEntity entity = ssEntities.get(position);
holder.likeView.setActivated(entity.isLike);
holder.likeView.setNumber(entity.likeNum);
holder.likeView.setGravity(position+1);
holder.likeView.setCallback(new LikeView.SimpleCallback() {
//点赞view的设置
holder.like.setActivated(entity.isLike);
holder.like.setNumber(entity.likeNum);
holder.like.setCallback(new LikeView.SimpleCallback() {
@Override
public void activate(LikeView view) {
// Toast.makeText(mContext, "你觉得"+entity.name+"很赞!", Toast.LENGTH_SHORT).show();
Snackbar.make(view, "你觉得" + entity.name + "很赞!", Snackbar.LENGTH_SHORT).show();
}

@Override
public void deactivate(LikeView view) {
//Toast.makeText(mContext, "你取消了对"+entity.name+"的赞!", Toast.LENGTH_SHORT).show();
Snackbar.make(view, "你取消了对" + entity.name + "的赞!", Snackbar.LENGTH_SHORT).show();
}
});
//评论view的设置
holder.comment.setNumber(entity.commentNum);
//设置图形适配器
holder.comment.setGraphAdapter(CommentPathAdapter.getInstance());
holder.comment.setCallback(new LikeView.SimpleCallback(){
@Override
public boolean onClick(LikeView view) {
Snackbar.make(view, "你点击" + entity.name + "的评论按钮", Snackbar.LENGTH_SHORT).show();
//返回true代表拦截此次点击,不使用默认的点击事件
return true;
}
});
holder.name.setText(entity.name);
holder.content.setText(entity.content);
}
Expand All @@ -67,14 +78,16 @@ public int getItemCount() {
}

class SSHolder extends RecyclerView.ViewHolder {
LikeView likeView;
LikeView like;
LikeView comment;
ImageView icon;
TextView name;
TextView content;

SSHolder(View itemView) {
super(itemView);
likeView = (LikeView) itemView.findViewById(R.id.lv);
like = (LikeView) itemView.findViewById(R.id.lv);
comment = (LikeView) itemView.findViewById(R.id.comment);
icon = (ImageView) itemView.findViewById(R.id.icon);
name = (TextView) itemView.findViewById(R.id.name);
content = (TextView) itemView.findViewById(R.id.content);
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/java/cn/izouxiang/likeviewdemo/SSEntity.java
Expand Up @@ -12,10 +12,12 @@ public class SSEntity {
public String content = "今天贼嗨!今天贼嗨!今天贼嗨!今天贼嗨!今天贼嗨!今天贼嗨!今天贼嗨!今天贼嗨!今天贼嗨!今天贼嗨!今天贼嗨!今天贼嗨!今天贼嗨!";
public boolean isLike;
public int likeNum;
public int commentNum;

public SSEntity(String name, boolean isLike, int likeNum) {
public SSEntity(String name, boolean isLike, int likeNum,int commentNum) {
this.name = name;
this.isLike = isLike;
this.likeNum = likeNum;
this.commentNum = commentNum;
}
}
1 change: 1 addition & 0 deletions app/src/main/res/layout/activity_main.xml
Expand Up @@ -10,6 +10,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rcv"
android:layout_marginBottom="40dp"
/>

</android.support.design.widget.CoordinatorLayout>
8 changes: 4 additions & 4 deletions app/src/main/res/layout/layout_item.xml
Expand Up @@ -49,6 +49,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
>

<cn.izouxiang.likeview.LikeView
Expand All @@ -65,16 +66,15 @@
app:number="99"
app:textSize="14sp"
app:notAllowedCancel="false"
app:gravity="left"
app:gravity="center"
/>

<Button
<cn.izouxiang.likeview.LikeView
android:id="@+id/comment"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="#00000000"
android:text="评论"
/>
</LinearLayout>
</LinearLayout>
@@ -0,0 +1,40 @@
package cn.izouxiang.likeview;

import android.graphics.Path;

/**
* Created by zouxiang on 2016/12/5.
*/

public class CommentPathAdapter implements LikeView.GraphAdapter {
private static CommentPathAdapter instance;
private static final float xOffsetScale = 0.06f;
private static final float yOffsetScale = 0.2f;
//可用单例模式
public static CommentPathAdapter getInstance() {
synchronized (CommentPathAdapter.class) {
if (null == instance) {
instance = new CommentPathAdapter();
}
}
return instance;
}
//这里绘制你想要的图形
@Override
public Path getGraphPath(LikeView view, int length) {
Path path = new Path();
int dx = (int) (length * xOffsetScale);
int dy = (int) (length * yOffsetScale);
int w = (int) (length * (1 - xOffsetScale * 2));
int h = (int) (length * (1 - yOffsetScale * 2));
path.moveTo(dx, dy);
path.lineTo(dx + w, dy);
path.lineTo(dx + w, dy + h);
path.lineTo(dx + (w * 0.35f), dy + h);
path.lineTo(dx + (w * 0.1f), dy + (h * 1.4f));
path.lineTo(dx + (w * 0.1f), dy + h);
path.lineTo(dx, dy + h);
path.lineTo(dx, dy);
return path;
}
}
18 changes: 14 additions & 4 deletions likeview/src/main/java/cn/izouxiang/likeview/LikeView.java
Expand Up @@ -74,7 +74,7 @@ public class LikeView extends View {
private int graphStrokeWidth;
private int textStrokeWidth;
private Callback callback = new SimpleCallback();
private GraphAdapter graphAdapter = new HeartGraphAdapter();
private GraphAdapter graphAdapter = HeartGraphAdapter.getInstance();
private Path graphPath;
//是否开启预先处理文本宽度,即测量当前值+1/-1后文本宽度变化,取最大值
private boolean autoMeasureMaxTextWidth;
Expand Down Expand Up @@ -301,7 +301,7 @@ private void handleNewString() {
private void measureTextWidthChanged(){
float oldTextWidth = textWidth;
measureTextWidth();
//如果宽度改变,并且初始化完成,则要重新测量默认宽高
//如果宽度改变,则要重新测量默认宽高
if (oldTextWidth != textWidth) {
int oldDefWidth = defWidth;
int oldDefHeight = defHeight;
Expand Down Expand Up @@ -452,6 +452,7 @@ private void measureStartPoint(){
protected void onDraw(Canvas canvas) {
drawGraph(canvas);
drawNumber(canvas);

}

/**
Expand Down Expand Up @@ -507,7 +508,7 @@ private void drawGraph(Canvas canvas) {
/**
* 将图形缩放绘画
*
* @param canvas 画笔
* @param canvas 画布
* @param scale 比例
*/
private void drawGraphPathByScale(Canvas canvas, float scale) {
Expand Down Expand Up @@ -629,6 +630,7 @@ public void setGraphStrokeWidth(int graphStrokeWidth) {
public void setGraphAdapter(GraphAdapter graphAdapter) {
if (graphAdapter != null) {
this.graphAdapter = graphAdapter;
getGraphPath();
postInvalidate();
}
}
Expand Down Expand Up @@ -743,7 +745,15 @@ public interface GraphAdapter {
* 桃心图形类
*/
public static class HeartGraphAdapter implements GraphAdapter {

private static HeartGraphAdapter instance;
public static HeartGraphAdapter getInstance(){
synchronized (HeartGraphAdapter.class){
if(null == instance){
instance = new HeartGraphAdapter();
}
}
return instance;
}
@Override
public Path getGraphPath(LikeView view, int length) {
return PathUtils.getHeartPath(length);
Expand Down
10 changes: 10 additions & 0 deletions likeview/src/main/java/cn/izouxiang/likeview/util/PathUtils.java
Expand Up @@ -11,6 +11,7 @@ public class PathUtils {
* 在一个正方形中画一个爱心
*
* @param length 正方形边长
* @param scale 缩放比
* @return 包含Heart路径的Path
*/
public static Path getHeartPath(int length, float scale) {
Expand All @@ -26,10 +27,19 @@ public static Path getHeartPath(int length, float scale) {
return path;
}


public static Path getHeartPath(int length) {
return getHeartPath(length, 1f);
}

/**
* 添加一个路径到指定的Path
* @param path 被添加的Path
* @param x 起点x
* @param y 起点y
* @param length 正方形边长
* @param scale 缩放比例
*/
public static void addHeart(Path path, int x, int y, int length, float scale) {
Path temp = getHeartPath(length, scale);
temp.offset(x, y);
Expand Down
6 changes: 5 additions & 1 deletion likeview/src/main/res/values/attrs.xml
Expand Up @@ -27,11 +27,15 @@
<attr name="autoMeasureMaxWidth" format="boolean"/>
<!--是否不允许取消点赞,默认false-->
<attr name="notAllowedCancel" format="boolean"/>
<!--对齐方式-->
<!--对齐方式,前三种默认垂直居中-->
<attr name="gravity" format="enum">
<!--居中-->
<enum name="center" value="1"/>
<!--左对齐-->
<enum name="left" value="2"/>
<!--右对齐-->
<enum name="right" value="3"/>
<!--开始点-->
<enum name="start" value="4"/>
</attr>
</declare-styleable>
Expand Down

0 comments on commit 45295de

Please sign in to comment.