总结几个常用的开源demo

1.GIFVIEW显示gif动画
主页:http://code.google.com/p/gifview/   下载:http://code.google.com/p/gifview/downloads/list
简介:android中现在没有直接显示gif的view,只能通过mediaplay来显示,且还常常不能正常显示出来,为此写了这个gifview,其用法和imageview一样
1)-把GifView.jar加入你的项目。
2)-在xml中配置GifView的基本属性,GifView继承自View类,和Button、ImageView一样是一个UI控件。如:
    <com.ant.liao.GifView android:id="@+id/gif2"
        android:layout_height="wrap_content" android:layout_width="wrap_content"
        android:paddingTop="4px" android:paddingLeft="14px" android:enabled="false" />

3)-在代码中配置常用属性:
        // 从xml中得到GifView的句柄
        gf1 = (GifView) findViewById(R.id.gif1);
        // 设置Gif图片源
        gf1.setGifImage(R.drawable.gif1);
        // 添加监听器
        gf1.setOnClickListener(this);
        // 设置显示的大小,拉伸或者压缩
        gf1.setShowDimension(300, 300);
        // 设置加载方式:先加载后显示、边加载边显示、只显示第一帧再显示
        gf1.setGifImageType(GifImageType.COVER);
GifView的Jar包共有四个类:
   GifAction.java
     观察者类,监视GIF是否加载成功
   GifFrame.java
     里面三个成员:当前图片、延时、下张Frame的链接。
   GifDecoder.java
     解码线程类
   GifView.java
     主类,包括常用方法,如GifView构造方法、设置图片源、延迟、绘制等。
不过从网站下载的gifViewDemo会报错  希望大家一起解决

2.CoverFlow
先付张效果图

CoverFlow从Gallery继承过来
package com.coverflow;

import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Transformation;
import android.widget.Gallery;
import android.widget.ImageView;

public class CoverFlow extends Gallery {

    private Camera mCamera = new Camera();
    private int mMaxRotationAngle = 50;
    private int mMaxZoom = -380;
    private int mCoveflowCenter;
    private boolean mAlphaMode = true;
    private boolean mCircleMode = false;

    public CoverFlow(Context context) {
        super(context);
        this.setStaticTransformationsEnabled(true);
    }

    public CoverFlow(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.setStaticTransformationsEnabled(true);
    }

    public CoverFlow(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.setStaticTransformationsEnabled(true);
    }

    public int getMaxRotationAngle() {
        return mMaxRotationAngle;
    }

    public void setMaxRotationAngle(int maxRotationAngle) {
        mMaxRotationAngle = maxRotationAngle;
    }

    public boolean getCircleMode() {
        return mCircleMode;
    }

    public void setCircleMode(boolean isCircle) {
        mCircleMode = isCircle;
    }

    public boolean getAlphaMode() {
        return mAlphaMode;
    }

    public void setAlphaMode(boolean isAlpha) {
        mAlphaMode = isAlpha;
    }

    public int getMaxZoom() {
        return mMaxZoom;
    }

    public void setMaxZoom(int maxZoom) {
        mMaxZoom = maxZoom;
    }

    private int getCenterOfCoverflow() {
        return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2
                + getPaddingLeft();
    }

    private static int getCenterOfView(View view) {
        return view.getLeft() + view.getWidth() / 2;
    }

    protected boolean getChildStaticTransformation(View child, Transformation t) {
        final int childCenter = getCenterOfView(child);
        final int childWidth = child.getWidth();
        int rotationAngle = 0;
        t.clear();
        t.setTransformationType(Transformation.TYPE_MATRIX);
        if (childCenter == mCoveflowCenter) {
            transformImageBitmap((ImageView) child, t, 0);
        } else {
            rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);
            if (Math.abs(rotationAngle) > mMaxRotationAngle) {
                rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle
                        : mMaxRotationAngle;
            }
            transformImageBitmap((ImageView) child, t, rotationAngle);
        }
        return true;
    }

    /**
     * 这就是所谓的在大小的布局时,这一观点已经发生了改变。如果 你只是添加到视图层次,有人叫你旧的观念 价值观为0。
     *
     * @param w
     *            Current width of this view.
     * @param h
     *            Current height of this view.
     * @param oldw
     *            Old width of this view.
     * @param oldh
     *            Old height of this view.
     */
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        mCoveflowCenter = getCenterOfCoverflow();
        super.onSizeChanged(w, h, oldw, oldh);
    }

    /**
     * 把图像位图的角度通过
     *
     * @param imageView
     *            ImageView the ImageView whose bitmap we want to rotate
     * @param t
     *            transformation
     * @param rotationAngle
     *            the Angle by which to rotate the Bitmap
     */
    private void transformImageBitmap(ImageView child, Transformation t,
            int rotationAngle) {
        mCamera.save();
        final Matrix imageMatrix = t.getMatrix();
        final int imageHeight = child.getLayoutParams().height;
        final int imageWidth = child.getLayoutParams().width;
        final int rotation = Math.abs(rotationAngle);
        mCamera.translate(0.0f, 0.0f, 100.0f);

        // 如视图的角度更少,放大
        if (rotation <= mMaxRotationAngle) {
            float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));
            mCamera.translate(0.0f, 0.0f, zoomAmount);
            if (mCircleMode) {
                if (rotation < 40)
                    mCamera.translate(0.0f, 155, 0.0f);
                else
                    mCamera.translate(0.0f, (255 - rotation * 2.5f), 0.0f);
            }
            if (mAlphaMode) {
                ((ImageView) (child)).setAlpha((int) (255 - rotation * 2.5));
            }
        }
        mCamera.rotateY(rotationAngle);
        mCamera.getMatrix(imageMatrix);
        imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));
        imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));
        mCamera.restore();
    }
}
这个就是CoverFlow类,说明几点:
1. 成员函数
mCamera是用来做类3D效果处理,比如z轴方向上的平移,绕y轴的旋转等
mMaxRotationAngle是图片绕y轴最大旋转角度,也就是屏幕最边上那两张图片的旋转角度
mMaxZoom是图片在z轴平移的距离,视觉上看起来就是放大缩小的效果.
其他的变量都可以无视
也就是说把这个属性设成true的时候每次viewGroup(看Gallery的源码就可以看到它是从ViewGroup间接继承过来的)在重新画它的child的时候都会促发getChildStaticTransformation这个函数,所以我们只需要在这个函数里面去加上旋转和放大的操作就可以了
其他的gettersetter函数都可以无视

ImageAdapter适配器:
package com.coverflow;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

import com.gallery.R;

public class ImageAdapter extends BaseAdapter {
    int mGalleryItemBackground;
    private Context mContext;
    private Integer[] mImageIds = {
            R.drawable.a1,
            R.drawable.a2,
            R.drawable.a3,
            R.drawable.a4,
            R.drawable.a5 };

    public ImageAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
        return mImageIds.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        ImageView i = createReflectedImages(mContext,mImageIds[position]);
        
        i.setLayoutParams(new CoverFlow.LayoutParams(120, 100));
        i.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        
        // 设置的抗锯齿
        BitmapDrawable drawable = (BitmapDrawable) i.getDrawable();
        drawable.setAntiAlias(true);
        return i;
    }

    public float getScale(boolean focused, int offset) {
        return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));
    }
   
    public ImageView createReflectedImages(Context mContext,int imageId) {

        Bitmap originalImage = BitmapFactory.decodeResource(mContext.getResources(), imageId);
        
        final int reflectionGap = 4;
        
        int width = originalImage.getWidth();
        int height = originalImage.getHeight();

        Matrix matrix = new Matrix();
        matrix.preScale(1, -1);

        Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
                height / 2, width, height / 2, matrix, false);

        Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
                (height + height / 2), Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmapWithReflection);

        canvas.drawBitmap(originalImage, 0, 0, null);

        Paint deafaultPaint = new Paint();
        canvas.drawRect(0, height, width, height + reflectionGap, deafaultPaint);

        canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);

        Paint paint = new Paint();
        LinearGradient shader = new LinearGradient(0, originalImage
                .getHeight(), 0, bitmapWithReflection.getHeight()
                + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.MIRROR);

        paint.setShader(shader);

        paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));

        canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
                + reflectionGap, paint);

        ImageView imageView = new ImageView(mContext);
        imageView.setImageBitmap(bitmapWithReflection);

        return imageView;
    }
   
}

3.Mobi pick
Mobi Pick 是一个 Android 风格的  jQuery Mobile的日期选择组件  
下载地址:http://mobipick.sustainablepace.net/

4.滑动式菜单
下载地址:https://github.com/jfeinstein10/SlidingMenu
<com.slidingmenu.lib.SlidingMenu    xmlns:sliding="http://schemas.android.com/apk/res-auto"    android:id="@+id/slidingmenulayout"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    sliding:viewAbove="@layout/YOUR_ABOVE_VIEW"    sliding:viewBehind="@layout/YOUR_BEHIND_BEHIND"    sliding:touchModeAbove="margin|fullscreen"    sliding:touchModeBehind="margin|fullscreen"    sliding:behindOffset="@dimen/YOUR_OFFSET"    sliding:behindScrollScale="@dimen/YOUR_SCALE"    sliding:shadowDrawable="@drawable/YOUR_SHADOW"    sliding:shadowWidth="@dimen/YOUR_SHADOW_WIDTH" />

5.SwitchButton
类似ios上的SwitchButton  支持滑动和动画
下载地址:https://github.com/IssacWang/SwitchButton

6.listview android-pullTorefresh
现在很多android应用程序,比如新浪微博,在联网刷新内容时,都有一个滑动刷新的ListView,用户将内容下滑,就会有新的结果呈现。
这个项目的源码托管在github上,地址为:https://github.com/johannilsson/android-pulltorefresh
下面来介绍如何使用:
滑动刷新其实就用到一个类PullToRefreshListView,它是ListView的子类,相应用到的layout文件为pull_to_refresh_header.xml。也就是说要用滑动刷新,需要将上面的类和xml及一些图片下载下来放到自己的工程中调用。
<!--
  The PullToRefreshListView replaces a standard ListView widget.
-->
<com.markupartist.android.widget.PullToRefreshListView
    android:id="@+id/android:list"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    />

在activity中加入下面的代码:
// Set a listener to be invoked when the list should be refreshed.
((PullToRefreshListView) getListView()).setOnRefreshListener(new OnRefreshListener() {
    @Override
    public void onRefresh() {
        // Do work to refresh the list here.
        new GetDataTask().execute();
    }
});

private class GetDataTask extends AsyncTask<Void, Void, String[]> {
    ...
    @Override
    protected void onPostExecute(String[] result) {
        mListItems.addFirst("Added after refresh...");
        // Call onRefreshComplete when the list has been refreshed.
        ((PullToRefreshListView) getListView()).onRefreshComplete();
        super.onPostExecute(result);
    }
}
7.android 瀑布流实例 android_waterfall
下载地址:https://github.com/dodola/android_waterfall/downloads
Android瀑布流实例 实现了类似于迷尚android和蘑菇街android的瀑布流布局

8.AsyncImageView
下载地址:https://github.com/cyrilmottier/GreenDroid
AsyncImageView 是 Android 上的一个异步从网络上获取图片并进行浏览的开源组件,可自动在本地进行缓存。该项目是 GreenDroid 的一部分。

转载于:https://www.cnblogs.com/zisexingchen/p/3239645.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【地平线cmsV2.3更新说明】 01.新增:后台文章内容支持导出Excel表格文件,在文章树页面导出整站文章数据,在各栏目管理页面下导出各对应栏目的文章数据。 02.新增:手机端页面浏览支持,与电脑端数据同步,手机端浏览友好。 03.修复:调整了文档的结构,所有发布的前端页面在Publish文件夹下,便于二次开发及文档管理。 04.新增:后台内容-文章模块,增加文章搜索功能。 05.新增:后台增加信息模块,根据配置的栏目,提供信息检索。 06.修复:改善后台图片上传体验,增加图片预览、图片尺寸修改功能。 07.新增:增加是否添加图片水印选项配置。     演示地址的用户名密码:demo   地平线开源软件自发布第一版以来,得到了众多用户的好评,以其体积小,高效率,界面清新,管理方便而赢得好评。地平线是一款免费、极易进行二次开发的开源软件。我们陆续发布了几个测试版本,功能不断完善,用户体验不断提高。但是,在开源软件领域这块,地平线做的还远远不够,地平线的开源之路任重而道远。   系统后台采用树形目录管理方式,可以自定义整站栏目以及任意基本的子栏目,实现傻瓜式的栏目Diy,让您的站点栏目规划轻松搞定! 系统后台文本编辑器为自主研发,所见即所得,支持插入图片,视频,文字修饰,附件上传等。   系统前端设计大气典雅,适合模板定制和更换,导航栏采用下拉菜单方式,与后台目录树成功对接   文章列表页采用文章摘要和文章缩略图的方格子展示方式,摘要和缩略图为系统后台添加或者编辑文章时候系统智能提取的,不需要用户额外的工作。真正实现系统傻瓜式维护     相关阅读 同类推荐:站长常用源码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值