当前位置: 搜索的结果

高仿Instagram 页面效果android特效

高仿Instagram 页面效果,页面UI加载列表,展示图片效果挺不错的,
并且支持收藏和评论等,评论后列表展示效果。

AndroidStaggeredGrid实现grid效果

AndroidStaggeredGrid实现grid效果,此demo适合初学者使用来实现效果,demo中已经封装好,调用方法也很简单,
直接在布局设置展示参数就可以了。自定义StaggeredGridView控件,控件增加 mGridView.addHeaderView(header);
   mGridView.addFooterView(footer);两个方法来实现头部和底部。
通过如下代码实现加载更多
   @Override
    public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) {
        Log.d(TAG, "onScroll firstVisibleItem:" + firstVisibleItem +
                            " visibleItemCount:" + visibleItemCount +
                            " totalItemCount:" + totalItemCount);
        // our handling
        if (!mHasRequestedMore) {
            int lastInScreen = firstVisibleItem + visibleItemCount;
            if (lastInScreen >= totalItemCount) {
                Log.d(TAG, "onScroll lastInScreen - so load more");
                mHasRequestedMore = true;
                onLoadMoreItems();
            }
        }
    }

PercentageBar自定义动态柱形图

PercentageBar自定义动态柱形图,
本项目由开发者 阿拉灯神灯提供:https://github.com/nugongshou110/PercentageBar/tree/master
大图实现:通过自定义PercentageBar实现,
部分代码如下:
 
public class PercentageBar extends View{
    //画线的画笔
    private Paint mLinePaint;
    //画柱状图的画笔
    private Paint mBarPaint;
    //写字的画笔
    private Paint mTextPaint;

    //开始X坐标
    private int startX;
    //开始Y坐标
    private int startY;
    //结束X坐标
    private int stopX;

    //测量值 宽度
    private int measuredWidth;
    //测量值 高度
    private int measuredHeight;
    //每条柱状图的宽度
    private int barWidth;
    //设置最大值,用于计算比例
    private float max;
    //设置每条柱状图的目标值,除以max即为比例
    private ArrayList<Float> respTarget;
    //设置一共有几条柱状图
    private int totalBarNum;
    //设置每条柱状图的当前比例
    private Float[] currentBarProgress;
    //每条竖线的当前比例
    private int currentVerticalLineProgress;
    //最上面一条横线的比例
    private int currentHorizentalLineProgress;
    //每条柱状图的名字
    private ArrayList<String> respName;
    //每条竖线之间的间距
    private int deltaX;
    //每条柱状图之间的间距
    private int deltaY;
    //一共有几条竖线
    private int verticalLineNum;
    //单位
    private String unit;
    //每条竖线之间相差的值
    private float numPerUnit;

    public PercentageBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

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

    public PercentageBar(Context context) {
        super(context);
        init(context);
    }

    private void init(Context context) {
        //设开始X坐标为0
        startX =0;
        //设开始Y坐标为50
        startY =50;
        //初始化柱状图画笔
        mBarPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mBarPaint.setColor(0xff40E0D0);
        mBarPaint.setStyle(Style.FILL);
        //初始化线的画笔
        mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mLinePaint.setStyle(Style.FILL);
        mLinePaint.setColor(0xffcdcdcd);
        mLinePaint.setStrokeWidth(2);


    }

    /**
     * 测量方法,主要考虑宽和高设置为wrap_content的时候,我们的view的宽高设置为多少
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
        //如果宽和高都为wrap_content的时候,我们将宽设置为我们输入的max值,也就是柱状图的最大值
        //高度为每条柱状图的宽度加上间距再乘以柱状图条数再加上开始Y值后得到的值
        if (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension((int) max, startY+10+totalBarNum*(barWidth+2*10));
            //如果宽度为wrap_content  高度为match_parent或者精确数值的时候
        }else if (widthSpecMode == MeasureSpec.AT_MOST) {
            //宽度设置为max,高度为父容器高度
            setMeasuredDimension((int) max, heightSpecSize);
            //如果宽度为match_parent或者精确数值的时候,高度为wrap_content
        }else if (heightSpecMode == MeasureSpec.AT_MOST) {
            //宽度设置为父容器的宽度,高度为每条柱状图的宽度加上间距再乘以柱状图条数再加上开始Y值后得到的值
            setMeasuredDimension(widthSpecSize, startY+10+totalBarNum*(barWidth+2*10));
        }


    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        //获得测量后的宽度
        measuredWidth = getMeasuredWidth();
        //获得测量后的高度
        measuredHeight = getMeasuredHeight();
        //计算结束X的值
        stopX = measuredWidth-barWidth;
        //计算每条竖线之间的间距
        deltaX = (stopX-(startX+7*barWidth/5))/verticalLineNum;
        //计算每条柱状图之间的间距
        deltaY = (measuredHeight-startY-barWidth*totalBarNum)/totalBarNum;
        //计算出每条竖线所代表的数值
        numPerUnit = max/verticalLineNum;
        //初始化最上面横线的初始进度
        currentHorizentalLineProgress = stopX;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        /**
         * 画柱状图
         */
        for(int i = 0 ; i<totalBarNum ; i++){
            if (currentBarProgress[i]<(respTarget.get(i)/max)*stopX) {
                currentBarProgress[i]+=10;
                postInvalidateDelayed(10);
            }
            canvas.drawText(respName.get(i),startX,startY+deltaY+i*(deltaY+barWidth)+3*barWidth/4, mTextPaint);
            canvas.drawRect(startX+7*barWidth/5, startY+deltaY+i*(deltaY+barWidth), currentBarProgress[i], startY+deltaY+i*(deltaY+barWidth)+barWidth, mBarPaint);
        }
        /**
         * 画竖线
         */
        for(int i=0 ; i<verticalLineNum ; i++){
            if (currentVerticalLineProgress< measuredHeight) {
                currentVerticalLineProgress+=3;
                postInvalidateDelayed(10);
            }
            canvas.drawLine((startX+7*barWidth/5)+(i+1)*deltaX, startY, (startX+7*barWidth/5)+(i+1)*deltaX, currentVerticalLineProgress, mLinePaint);
            canvas.drawText(numPerUnit*(i+1)+unit, (startX+7*barWidth/5)+(i+1)*deltaX-barWidth, startY-barWidth/5, mTextPaint);
        }
        /**
         * 画最上面的横线
         */
        if (currentHorizentalLineProgress>startX+7*barWidth/5) {
            currentHorizentalLineProgress-=10;
            postInvalidateDelayed(10);
        }
        canvas.drawLine(stopX, startY, currentHorizentalLineProgress, startY, mLinePaint);
    }

    /**
     * 设置每个柱状图的宽度
     * @param width
     */
    public void setBarWidth(int width){
        this.barWidth = width;
        mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mTextPaint.setTextSize(3*barWidth/5);
        mTextPaint.setStrokeWidth(1);
        mTextPaint.setColor(0xffababab);

 

    }
    /**
     * 设置最大值
     * @param max
     */
    public void setMax(float max){
        this.max = max;
    }

    /**
     * 设置一共有几个柱状图
     * @param totalNum
     */
    public void setTotalBarNum(int totalNum){
        this.totalBarNum = totalNum;
        currentBarProgress = new Float[totalNum];
        for(int i = 0 ; i<totalNum ; i++){
            currentBarProgress[i] = 0.0f;
        }
    }

    /**
     * 分别设置每个柱状图的目标值
     * @param respTarget
     */
    public void setRespectTargetNum(ArrayList<Float> respTarget){
        this.respTarget = respTarget;

    }

    /**
     * 分别设置每个柱状图的名字
     * @param respName
     */
    public void setRespectName(ArrayList<String> respName){
        this.respName = respName;
    }

    /**
     * 设置单位
     * @param unit
     */
    public void setUnit(String unit){
        this.unit = unit;
    }

    /**
     * 设置有几条竖线
     * @param num
     */
    public void setVerticalLineNum(int num){
        this.verticalLineNum = num;
    }

 

}


调用:
  respectTarget = new ArrayList<Float>();
        respName = new ArrayList<String>();
        respectTarget.add(35.0f);
        respectTarget.add(20.0f);
        respectTarget.add(18.0f);
        respectTarget.add(15.0f);
        respectTarget.add(10.0f);
        respectTarget.add(8.0f);
        respectTarget.add(5.0f);
        respName.add("滴滴");
        respName.add("小米");
        respName.add("京东");
        respName.add("美团");
        respName.add("魅族");
        respName.add("酷派");
        respName.add("携程");
        mBarGraph = (PercentageBar) findViewById(R.id.bargraph);
        mBarGraph.setRespectTargetNum(respectTarget);
        mBarGraph.setRespectName(respName);
        mBarGraph.setTotalBarNum(7);
        mBarGraph.setMax(40);
        mBarGraph.setBarWidth(50);
        mBarGraph.setVerticalLineNum(4);
        mBarGraph.setUnit("亿元");

PercentageCircle 自定义圆环效果

本项目来自:张奇
博客:http://blog.csdn.net/nugongahou110?viewmode=list
PercentageCircle 自定义圆环效果,指定中心园的背景颜色,圆环颜色,文字颜色,以及中心园的半径。
主要实现:
1.中间的圆 2.外边的圆环 3.中间的文字
//设置中心园的画笔
        mCirclePaint = new Paint();
        mCirclePaint.setAntiAlias(true);
        mCirclePaint.setColor(mCircleBackground);
        mCirclePaint.setStyle(Paint.Style.FILL);
        //设置文字的画笔
        mTextPaint = new Paint();
        mTextPaint.setColor(mTextColor);
        mTextPaint.setAntiAlias(true);
        mTextPaint.setStyle(Paint.Style.FILL);
        mTextPaint.setStrokeWidth((float) (0.025*mRadius));
        mTextPaint.setTextSize(mRadius/2);
        mTextPaint.setTextAlign(Align.CENTER);
        //设置外圆环的画笔
        mArcPaint = new Paint();
        mArcPaint.setAntiAlias(true);
        mArcPaint.setColor(mRingColor);
        mArcPaint.setStyle(Paint.Style.STROKE);
        mArcPaint.setStrokeWidth((float) (0.075*mRadius));

 

AndroidTagGroup实现云标签效果

AndroidTagGroup实现云标签效果,各种背景效果的标签,并且支持添加,
大体实现:有一个TagsManager管理TagGroup,自定义TagGroup,对TagGroup设置setTags(tags);
TagGroup extends ViewGroup,TagGroup 由多个TagView组成,TagView继承TextView 。
本例子来源:https://github.com/2dxgujun/AndroidTagGroup
主要绘制代码如下:
   @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawArc(mLeftCornerRectF, -180, 90, true, mBackgroundPaint);
            canvas.drawArc(mLeftCornerRectF, -270, 90, true, mBackgroundPaint);
            canvas.drawArc(mRightCornerRectF, -90, 90, true, mBackgroundPaint);
            canvas.drawArc(mRightCornerRectF, 0, 90, true, mBackgroundPaint);
            canvas.drawRect(mHorizontalBlankFillRectF, mBackgroundPaint);
            canvas.drawRect(mVerticalBlankFillRectF, mBackgroundPaint);

            if (isChecked) {
                canvas.save();
                canvas.rotate(45, mCheckedMarkerBound.centerX(), mCheckedMarkerBound.centerY());
                canvas.drawLine(mCheckedMarkerBound.left, mCheckedMarkerBound.centerY(),
                        mCheckedMarkerBound.right, mCheckedMarkerBound.centerY(), mCheckedMarkerPaint);
                canvas.drawLine(mCheckedMarkerBound.centerX(), mCheckedMarkerBound.top,
                        mCheckedMarkerBound.centerX(), mCheckedMarkerBound.bottom, mCheckedMarkerPaint);
                canvas.restore();
            }
            canvas.drawPath(mBorderPath, mBorderPaint);
            super.onDraw(canvas);
        }

 

Android-PictureTagView图片添加标签,标签支持任意拖动

Android-PictureTagView图片添加标签,标签支持任意拖动,最近打标签的应用很火,
就随便写了写,仿nice图片上打标签控件demo,提供给有需要的人一点思路吧。
原理其实很简单,自定义一个layout,图片作为background,然后监听ontouch,
通过变动的手指位置改变子控件位置。

点击图片没有标签的部分即可添加新标签,点击标签实现即时编辑,支持拖动标签改变位置

AndroidStaggeredGrid允许非对齐行的GridView

AndroidStaggeredGrid允许非对齐行的GridView

允许非对齐行的GridView,类似Pinterest的瀑布流,继承自AbsListView

AndroidTagGroup

AndroidTagGroup 是一个通过自定义ViewGroup来显示标签的控件。可以添加与删除标签

 https://github.com/2dxgujun/AndroidTagGroup

Android-Cloud-TagView-Plus


Android上的云标签控件,除了能设置标签的样式外,还能监听标签的点击和删除事件。 支持设置标签内容的样式,如字体大小、颜色 支持设置标签的颜色、点击效果、圆角效果、是否可删除 能监听标签的点击和删除事件 支持从代码或者XML创建TagView

TagCloudLinkView

可以完成添加、删除、选择操作的标签控件,可以自定样式(颜色等),可删除的标签末尾带有'×'符号。和Android-Cloud-TagView-Plus(见正文相关代码)类似。

https://github.com/namito/TagCloudLinkView/archive/master.zip