精华内容
下载资源
问答
  • Android 图片预览模仿朋友查看图片效果放大图片,左右滑动 - transferee 使用框架:transferee 来实现 这里采用的是transferee的glide方法:https://github.com/Hitomis/transferee/blob/master/ap

    描述:

    效果图:

    使用框架:transferee 来实现

    这里采用的是transferee的glide方法:https://github.com/Hitomis/transferee/blob/master/app/src/main/java/com/hitomi/transferimage/activity/glide/GlideNoThumActivity.java

    代码:

    Gradle引入jar包:

     

    compile 'com.github.Hitomis.transferee:Transferee:v1.1.0'
        compile 'com.github.Hitomis.transferee:GlideLoader:v1.1.0'

     

    GlideNoThumActivity.java类:

     

    package com.hitomi.transferimage.activity.glide;
    
    import android.view.View;
    import android.widget.GridView;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import com.bumptech.glide.Glide;
    import com.bumptech.glide.request.RequestOptions;
    import com.hitomi.tilibrary.style.index.NumberIndexIndicator;
    import com.hitomi.tilibrary.style.progress.ProgressPieIndicator;
    import com.hitomi.tilibrary.transfer.TransferConfig;
    import com.hitomi.tilibrary.transfer.Transferee;
    import com.hitomi.transferimage.R;
    import com.hitomi.transferimage.activity.BaseActivity;
    import com.wepie.glide4loader.Glide4ImageLoader;
    import com.zhy.adapter.abslistview.CommonAdapter;
    import com.zhy.adapter.abslistview.ViewHolder;
    
    import java.util.ArrayList;
    
    public class GlideNoThumActivity extends BaseActivity {
    
        private RequestOptions options;
    
        {
            sourceImageList = new ArrayList<>();
            sourceImageList.add("http://t2.27270.com/uploads/tu/201706/9999/d38274f15c.jpg");
            sourceImageList.add("http://t2.27270.com/uploads/tu/201706/9999/061548f1fb.jpg");
            sourceImageList.add("http://t2.27270.com/uploads/tu/201706/9999/4a85dd9bd9.jpg");
            sourceImageList.add("http://t2.27270.com/uploads/tu/201706/9999/a6c57f438d.jpg");
            sourceImageList.add("http://t2.27270.com/uploads/tu/201706/9999/b6ae25c618.jpg");
            sourceImageList.add("http://t2.27270.com/uploads/tu/201612/562/lua4uwojfds.jpg");
            sourceImageList.add("http://t2.27270.com/uploads/tu/201612/562/4hp4d1fcocu.jpg");
            sourceImageList.add("http://t2.27270.com/uploads/tu/201612/562/d2madqozild.jpg");
            sourceImageList.add("http://ww1.sinaimg.cn/large/9be2329dgw1etlyb1yu49j20c82p6qc1.jpg");
    
        }
    
        @Override
        protected int getContentView() {
            return R.layout.activity_grid_view;
        }
    
        @Override
        protected void initView() {
            gvImages = (GridView) findViewById(R.id.gv_images);
        }
    
        @Override
        protected void testTransferee() {
            config = TransferConfig.build()
                    .setSourceImageList(sourceImageList)
                    .setMissPlaceHolder(R.mipmap.ic_empty_photo)
                    .setErrorPlaceHolder(R.mipmap.ic_empty_photo)
                    .setProgressIndicator(new ProgressPieIndicator())
                    .setIndexIndicator(new NumberIndexIndicator())
                    .setJustLoadHitImage(true)
                    .setImageLoader(Glide4ImageLoader.with(getApplicationContext()))
                    .setOnLongClcikListener(new Transferee.OnTransfereeLongClickListener() {
                        @Override
                        public void onLongClick(ImageView imageView, int pos) {
                            saveImageByUniversal(imageView);
                        }
                    })
                    .create();
            options = new RequestOptions().centerCrop()
                    .placeholder(R.mipmap.ic_empty_photo);
    
            gvImages.setAdapter(new NineGridAdapter());
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            if (requestCode != WRITE_EXTERNAL_STORAGE) {
                Toast.makeText(this, "请允许获取相册图片文件写入权限", Toast.LENGTH_SHORT).show();
            }
        }
    
        private class NineGridAdapter extends CommonAdapter<String> {
    
    
            public NineGridAdapter() {
                super(GlideNoThumActivity.this, R.layout.item_grid_image, sourceImageList);
            }
    
            @Override
            protected void convert(ViewHolder viewHolder, final String item, final int position) {
                ImageView imageView = viewHolder.getView(R.id.image_view);
    
                Glide.with(GlideNoThumActivity.this)
                        .load(item)
                        .apply(options)
                        .into(imageView);
    
                imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        config.setNowThumbnailIndex(position);
                        config.setOriginImageList(wrapOriginImageViewList(sourceImageList.size()));
    
                        transferee.apply(config).show(new Transferee.OnTransfereeStateChangeListener() {
                            @Override
                            public void onShow() {
                                Glide.with(GlideNoThumActivity.this).pauseRequests();
                            }
    
                            @Override
                            public void onDismiss() {
                                Glide.with(GlideNoThumActivity.this).resumeRequests();
                            }
                        });
                    }
                });
            }
        }
    	
    	protected List<ImageView> wrapOriginImageViewList(int size) {
            List<ImageView> originImgList = new ArrayList<>();
            for (int i = 0; i < size; i++) {
                ImageView thumImg = (ImageView) ((LinearLayout) gridview.getChildAt(i)).getChildAt(0);
                originImgList.add(thumImg);
            }
            return originImgList;
        }
    
    }

     


     

    ฅ՞•ﻌ•՞ฅ ~ 厚着脸皮要个赞赏哈 ~ ฅ՞•ﻌ•՞ฅ

     

    展开全文
  • Android 高仿微信发朋友浏览图片效果

    万次阅读 多人点赞 2015-11-23 22:18:46
    最近一直在高仿微信、高仿微信,今天小编再给大家分享一个仿微信发朋友浏览图片的效果.... 好了,先看一下效果吧: 下面就来说一下具体怎么实现的:实现思路1.首先我们要获取数据源,数据源就是我们的每条说说...
    最近一直在高仿微信、高仿微信,今天小编再给大家分享一个仿微信发朋友圈浏览图片的效果....
    

    好了,先看一下效果吧:
    这里写图片描述
    下面就来说一下具体怎么实现的:

    实现思路

    1.首先我们要获取数据源,数据源就是我们的每条说说(包括姓名、标题、图片数组)
    2.自定义适配器(ListView嵌套着GridView)
    3.图片点击浏览图片(Fragment+ViewPager)

    具体实现

    1.初始化数据源,设置适配器,看一下代码:

    public class MyActivity extends Activity {
        /*图片显示列表*/
        private ListView listView;
        /*图片URL数组*/
        private List<ContentBean> contentBeans;
        /*说说适配器*/
        private MyAdapter adapter;
    
        /**
         * Called when the activity is first created.
         */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            initData();
            initViews();
        }
    
        /**
         * 初始化数据
         * by Hankkin at:2015-11-22 23:21:28
         */
        private void initData(){
            contentBeans = new ArrayList<ContentBean>();
            ArrayList<String> imgUrls1 = new ArrayList<String>();
            imgUrls1.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            ContentBean cb1 = new ContentBean(1,"java","Sun Microsystems",imgUrls1);
            contentBeans.add(cb1);
    
            ArrayList<String> imgUrls2 = new ArrayList<String>();
            imgUrls2.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            imgUrls2.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            imgUrls2.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            ContentBean cb2 = new ContentBean(2,"OC","Stepstone",imgUrls2);
            contentBeans.add(cb2);
    
            ArrayList<String> imgUrls3 = new ArrayList<String>();
            imgUrls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            imgUrls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            imgUrls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            imgUrls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            imgUrls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            imgUrls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            imgUrls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            imgUrls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            imgUrls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110H2E40-6.jpg?attname=&e=1448288962&token=KDsCqUAWz3P-YT6In6oPnT56Eh2cig4zgQd12SJ_:AlTjfYD9SBFOdB4jmmZuKXAMOp8");
            ContentBean cb3 = new ContentBean(3,"python","Guido van Rossum",imgUrls3);
            contentBeans.add(cb3);
        }
    
        /**
         * 初始化组件
         * by Hankkin at:2015-11-22 23:21:44
         */
        private void initViews(){
            listView = (ListView) findViewById(R.id.lv_my);
            adapter = new MyAdapter(MyActivity.this,contentBeans);
            listView.setAdapter(adapter);
        }
    }

    这里面的图片是我上传到七牛的网络图片,加载图片是用ImageLoader,下面也有具体的ImageLoader配置。
    2.看一下适配器内容
    在说说列表适配器中去设置图片的适配器,图片的GridView是重写了一个不能滑动的GridView,重写一下OnMeasure();

    public class MyAdapter extends BaseAdapter {
    
        private Context context;
        private List<ContentBean> data;
    
        public MyAdapter(Context context, List<ContentBean> data) {
            this.context = context;
            this.data = data;
        }
    
        @Override
        public int getCount() {
            return data.size();
        }
    
        @Override
        public Object getItem(int i) {
            return data.get(i);
        }
    
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            ViewHolder holder;
            if (view == null) {
                holder = new ViewHolder();
                view = View.inflate(context, R.layout.item, null);
                holder.gridView = (NoScrollGridView) view.findViewById(R.id.gridview);
                holder.tvName = (TextView) view.findViewById(R.id.tv_name);
                holder.tvTitle = (TextView) view.findViewById(R.id.tv_title);
                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();
            }
    
            final ContentBean bean = data.get(i);
    
            holder.tvName.setText(bean.getName());
            holder.tvTitle.setText(bean.getTitle());
    
            if (data != null && data.size() > 0) {
                holder.gridView.setAdapter(new ImageGridAdapter(context, bean.getImgUrls()));
            }
            /**
             * 图片列表点击事件
             */
            holder.gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    Intent intent = new Intent(context, ImagePagerActivity.class);
                    intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_URLS, (Serializable) bean.getImgUrls());
                    intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_INDEX, i);
                    context.startActivity(intent);
                }
            });
    
            return view;
        }
    
        class ViewHolder {
            TextView tvName, tvTitle;
            NoScrollGridView gridView;
        }
    }

    3.然后就是图片浏览,这个网上也有好多的Demo,也有详细的讲解,直接拽过来用就可以了,下面的图片数量是监听setOnPageChangeListener()来改变下面的图片索引值

    /**
     * 图片查看器
     * Created by Hankkin on 15/11/22.
     */
    public class ImagePagerActivity extends FragmentActivity {
        private static final String STATE_POSITION = "STATE_POSITION";
        public static final String EXTRA_IMAGE_INDEX = "image_index"; 
        public static final String EXTRA_IMAGE_URLS = "image_urls";
    
        private HackyViewPager mPager;
        private int pagerPosition;
        private TextView indicator;
    
        @Override 
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.image_detail_pager);
    
            pagerPosition = getIntent().getIntExtra(EXTRA_IMAGE_INDEX, 0);
            ArrayList<String> urls = getIntent().getStringArrayListExtra(EXTRA_IMAGE_URLS);
    
            mPager = (HackyViewPager) findViewById(R.id.pager);
            ImagePagerAdapter mAdapter = new ImagePagerAdapter(getSupportFragmentManager(), urls);
            mPager.setAdapter(mAdapter);
            indicator = (TextView) findViewById(R.id.indicator);
    
            CharSequence text = getString(R.string.viewpager_indicator, 1, mPager.getAdapter().getCount());
            indicator.setText(text);
            // 更新下标
            mPager.setOnPageChangeListener(new OnPageChangeListener() {
    
                @Override
                public void onPageScrollStateChanged(int arg0) {
                }
    
                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                }
    
                @Override
                public void onPageSelected(int arg0) {
                    CharSequence text = getString(R.string.viewpager_indicator, arg0 + 1, mPager.getAdapter().getCount());
                    indicator.setText(text);
                }
    
            });
            if (savedInstanceState != null) {
                pagerPosition = savedInstanceState.getInt(STATE_POSITION);
            }
    
            mPager.setCurrentItem(pagerPosition);
        }
    
        @Override
        public void onSaveInstanceState(Bundle outState) {
            outState.putInt(STATE_POSITION, mPager.getCurrentItem());
        }
    
        private class ImagePagerAdapter extends FragmentStatePagerAdapter {
    
            public ArrayList<String> fileList;
    
            public ImagePagerAdapter(FragmentManager fm, ArrayList<String> fileList) {
                super(fm);
                this.fileList = fileList;
            }
    
            @Override
            public int getCount() {
                return fileList == null ? 0 : fileList.size();
            }
    
            @Override
            public Fragment getItem(int position) {
                String url = fileList.get(position);
                return ImageDetailFragment.newInstance(url);
            }
    
        }
    }

    图片Fragment的详细界面,里面有长按点击事件,和图片加载的状态

    package com.hankkin.WeiXinLookImgsDemo.activty;
    
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.ProgressBar;
    import android.widget.Toast;
    
    import com.hankkin.WeiXinLookImgsDemo.R;
    import com.nostra13.universalimageloader.core.ImageLoader;
    import com.nostra13.universalimageloader.core.assist.FailReason;
    import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
    import com.others.PhotoViewAttacher;
    
    /**
     * 单张图片显示Fragment
     * Created by Hankkin on 15/11/22.
     */
    public class ImageDetailFragment extends Fragment {
        private String mImageUrl;
        private ImageView mImageView;
        private ProgressBar progressBar;
        private PhotoViewAttacher mAttacher;
    
        public static ImageDetailFragment newInstance(String imageUrl) {
            final ImageDetailFragment f = new ImageDetailFragment();
    
            final Bundle args = new Bundle();
            args.putString("url", imageUrl);
            f.setArguments(args);
    
            return f;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mImageUrl = getArguments() != null ? getArguments().getString("url") : null;
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            final View v = inflater.inflate(R.layout.image_detail_fragment, container, false);
            mImageView = (ImageView) v.findViewById(R.id.image);
            mAttacher = new PhotoViewAttacher(mImageView);
    
            mAttacher.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {
    
                @Override
                public void onPhotoTap(View arg0, float arg1, float arg2) {
                    getActivity().finish();
                }
            });
            mAttacher.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    Toast.makeText(getActivity().getApplicationContext(),"保存",Toast.LENGTH_SHORT).show();
                    return false;
                }
            });
            progressBar = (ProgressBar) v.findViewById(R.id.loading);
            return v;
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
    
            ImageLoader.getInstance().displayImage(mImageUrl, mImageView, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                    progressBar.setVisibility(View.VISIBLE);
                }
    
                @Override
                public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                    String message = null;
                    switch (failReason.getType()) {
                    case IO_ERROR:
                        message = "下载错误";
                        break;
                    case DECODING_ERROR:
                        message = "图片无法显示";
                        break;
                    case NETWORK_DENIED:
                        message = "网络有问题,无法下载";
                        break;
                    case OUT_OF_MEMORY:
                        message = "图片太大无法显示";
                        break;
                    case UNKNOWN:
                        message = "未知的错误";
                        break;
                    }
                    Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
                    progressBar.setVisibility(View.GONE);
                }
    
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    progressBar.setVisibility(View.GONE);
                    mAttacher.update();
                }
            });
        }
    }
    

    忘了ImageLoader的初始化工作了,给大家加上吧,我写到Application里了

    private MyApplication context;
    
        @Override
        public void onCreate() {
            super.onCreate();
            context = this;
            initImageLoader(context);
        }
    
        /**
         * 初始化Imageloader
         * by Hankkin at:2015-11-22 23:20:29
         * @param context
         */
        public static void initImageLoader(Context context){
            DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .showImageOnLoading(R.drawable.ic_launcher)
                    .showImageOnFail(R.drawable.ic_launcher)
                    .resetViewBeforeLoading(false)  // default
                    .delayBeforeLoading(0)
                    .cacheInMemory(true) // default
                    .cacheOnDisk(true) // default
                    .considerExifParams(true) // default
                    .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
                    .bitmapConfig(Bitmap.Config.ARGB_8888) // default
                    .displayer(new SimpleBitmapDisplayer()) // default
                    .handler(new Handler()) // default
                    .build();
            File picPath = new File(Environment.getExternalStorageDirectory().getPath() + File.separator + "weixinlookimgdemo" + File.separator + "files");
    
            ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                    .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
                    .diskCacheExtraOptions(480, 800, null)
                    .threadPoolSize(3) // default
                    .threadPriority(Thread.NORM_PRIORITY - 1) // default
                    .tasksProcessingOrder(QueueProcessingType.FIFO) // default
                    .denyCacheImageMultipleSizesInMemory()
                    .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
                    .memoryCacheSize(2 * 1024 * 1024)
                    .memoryCacheSizePercentage(13) // default
                    .diskCache(new UnlimitedDiscCache(picPath)) // default
                    .diskCacheSize(50 * 1024 * 1024)
                    .diskCacheFileCount(1000)
                    .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
                    .imageDownloader(new BaseImageDownloader(context)) // default
                    .imageDecoder(new BaseImageDecoder(true)) // default
                    .defaultDisplayImageOptions(options) // default
                    .writeDebugLogs()
                    .build();
            // Initialize ImageLoader with configuration.
            ImageLoader.getInstance().init(config);
        }

    这个效果就很容易实现了,揣摩别人的APP很容易,但是我们要试着去实现别人的APP,生命在于折腾,折腾吧,亲们…..
    最后小编把源码上传到了Github上,宝贝们,star吧
    https://github.com/Hankkin/WeiXinLookImgsDemo

    展开全文
  • 最近项目要求上传多图并且多图显示,而且要规则的显示,就像微信朋友图片显示一样。 想了一下用GridView再适合不过了,GridView可以动态加载图片的数量,而且还比较规律。下面说一下自己的思路: 1.获取网络...
    今天闲下来想用心写一点东西,发现没什么可写的,就写一下最近项目上用到的一些东西吧。最近项目要求上传多图并且多图显示,而且要规则的显示,就像微信朋友圈的图片显示一样。
    想了一下用GridView再适合不过了,GridView可以动态加载图片的数量,而且还比较规律。下面说一下自己的思路:
    1.获取网络图片
    2.初始化gridview,自定义适配器
    3.根据图片数量设置gridview的列数
    4.更新适配器

    下面贴上部分源码并给大家解析一下
    一、首先是GridView的item:
    <com.view.SquareLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
        <ImageView
            android:id="@+id/item_grida_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            android:layout_margin="@dimen/tinyest_space">
        </ImageView>
    </com.view.SquareLayout>
    这里的SquareLayout布局是自定义的下面会给大家详细讲解。
    子项中是一个正方形布局里面嵌套着图片

    二、接下来自定义适配器
    因为项目需求不同,自己定义的适配器和平时用的不太一样,这里就不贴源码了。大体上也是将图片下载到本地,用Imageloader加载,不过我这里有上传失败的和新建的,所以不太一样。

    三、最后在用到的Activity中设置
    noScrollgridview = (GridView) findViewById(R.id.noScrollgridview);
            noScrollgridview.setNumColumns(3);  //默认设置在3列图片
            //上传成功传值给adapter
            picAdapter = new PictureAdapter(this, 1, appItem_file);
            noScrollgridview.setAdapter(picAdapter);

    //根据图片数量设置图片的列
            int size = appItemFile.getFiles().split(",").length;
            if (size==1){
                noScrollgridview.setNumColumns(1);
            }
            else if (size==2){
                noScrollgridview.setNumColumns(2);
            }
            else if (size>2){
                noScrollgridview.setNumColumns(3);
            }
            picAdapter.notifyDataSetChanged();
    默认设置GridView的列数为3,根据图片的数量动态设置列数。

    最后贴上SquareLayout的源码解析一下
    /**
     * 方形布局
     */
    public class SquareLayout extends RelativeLayout {
    	public SquareLayout(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    	}
    
    	public SquareLayout(Context context, AttributeSet attrs) {
    		super(context, attrs);
    	}
    
    	public SquareLayout(Context context) {
    		super(context);
    	}
    
    	@SuppressWarnings("unused")
    	@Override
    	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    		// For simple implementation, or internal size is always 0.
    		// We depend on the container to specify the layout size of
    		// our view. We can't really know what it is since we will be
    		// adding and removing different arbitrary views and do not
    		// want the layout to change as this happens.
    		setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),
    				getDefaultSize(0, heightMeasureSpec));
    
    		// Children are just made to fill our space.
    		int childWidthSize = getMeasuredWidth();
    		int childHeightSize = getMeasuredHeight();
    		// 高度和宽度一样
    		heightMeasureSpec = widthMeasureSpec = MeasureSpec.makeMeasureSpec(
    				childWidthSize, MeasureSpec.EXACTLY);
    		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    	}
    }
    这里主要重写了onMeasure()方法,设置了高宽,需要注意的是在用SquareLayout的时候要设置它的高宽都是match_parent。这样就可以填满GridView的每一项了。
    接下来贴图给大家看:

    很整齐有没有
    ImgeView的scaleType的属性如果设置FitXY就会充满方形布局,如果center就会居中显示
    详细说一下吧:
    1)center:保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size,超过部分裁剪处理。
    2)centerCrop:以填满整个ImageView为目的,将原图的中心对准ImageView的中心,等比例放大原图,直到填满ImageView为止(指的是ImageView的宽和高都要填满),原图超过ImageView的部分作裁剪处理。
    3)centerInside:以原图完全显示为目的,将图片的内容完整居中显示,通过按比例缩小原图的size宽(高)等于或小于ImageView的宽(高)。如果原图的size本身就小于ImageView的size,则原图的size不作任何处理,居中显示在ImageView。
    4)matrix:不改变原图的大小,从ImageView的左上角开始绘制原图,原图超过ImageView的部分作裁剪处理
    5)fitCenter:把原图按比例扩大或缩小到ImageView的ImageView的高度,居中显示
    6)fitEnd:把原图按比例扩大(缩小)到ImageView的高度,显示在ImageView的下部分位置
    7)fitStart:把原图按比例扩大(缩小)到ImageView的高度,显示在ImageView的上部分位置
    8)fitXY:把原图按照指定的大小在View中显示,拉伸显示图片,不保持原比例,填满ImageView.

    ok就先这样了,以后我会经常更新博客和大家分享的

    展开全文
  • 模仿朋友分享图片

    2020-05-28 17:43:34
    今天学习了Android主要实现的是模仿朋友分享图片,接下来请欣赏一下我写的代码。 先来看看效果图,这是一个手机模拟器。 MainActivity 代码: public class MainActivity extends AppCompatActivity { ...

    今天学习了Android主要实现的是模仿朋友圈分享图片,接下来请欣赏一下我写的代码。

    先来看看效果图,这是一个手机模拟器。

    MainActivity 代码:

    public class MainActivity extends AppCompatActivity {
        private ListView listView;
        private MyListViewAdapter listViewAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            findID();
            init();
        }
        private void init(){
            listViewAdapter=new MyListViewAdapter(this);
            listView.setAdapter(listViewAdapter);
    
        }
        private void findID(){
            listView=findViewById(R.id.list_view);
        }
    }
    

     

    MyGridView 代码

    public class MyGridView extends GridView {
        private Context context;
        public MyGridView(Context context){
            super(context);
            this.context=context;
        }
       public MyGridView(Context context, AttributeSet attributeSet){
            super(context,attributeSet);
       }
       public MyGridView(Context context,AttributeSet attrbuteSet,int defstyle){
            super(context,attrbuteSet,defstyle);
       }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int expandSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);
    
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

     

    MyListViewAdapter 代码
    public class MyListViewAdapter extends BaseAdapter {
        private Context context;
        int[] image={R.mipmap.a,R.mipmap.b,R.mipmap.c,
                R.mipmap.d,R.mipmap.h,R.mipmap.g,R.mipmap.i,R.mipmap.d,R.mipmap.b};
        ArrayList<HashMap<String,Object>> imagelist;
        public MyListViewAdapter(Context context){
            this.context=context;
            imagelist=new ArrayList<HashMap<String, Object>>();
            for (int i=0;i<9;i++){
                HashMap<String,Object> map=new HashMap<String, Object>();
                map.put("image",image[i]);
                imagelist.add(map);
            }
        }
        @Override
        public int getCount() {
            //返回朋友圈的条数
            return 5;
        }
    
        @Override
        public Object getItem(int position) {
            return position;
        }
    
        @Override
        public long getItemId(int position) {
            //获取朋友圈的内容信息
            return 5;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            MyHolder holder=new MyHolder();
            if (convertView==null){
                convertView= LayoutInflater.from(context).inflate(R.layout.list_item_layout,null);
                holder.titleIV=convertView.findViewById(R.id.list_title_image);
                holder.titleTV=convertView.findViewById(R.id.list_title_text);
                holder.gridView=convertView.findViewById(R.id.list_item_grid_view);
                convertView.setTag(holder);
            }else {
                holder=(MyHolder) convertView.getTag();
            }
            //holder.titleIV.setImageDrawable();
            holder.titleTV.setText("这是朋友圈模拟的第"+position+1+"条数据");
            SimpleAdapter simpleAdapter=new SimpleAdapter(context,imagelist,R.layout.grid_item_layout,new String[]{"image"},new int[]{R.id.grid_item_image});
            holder.gridView.setAdapter(simpleAdapter);
            holder.gridView.setOnItemClickListener(new GridViewItemOnClick());
            return convertView;
        }
        class MyHolder{
            ImageView titleIV;
            TextView titleTV;
            MyGridView gridView;
        }
        class GridViewItemOnClick implements AdapterView.OnItemClickListener{
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent=new Intent(context,ShowImageActivity.class);
                intent.putExtra("id",position);
                intent.putExtra("image",image);
                context.startActivity(intent);
            }
        }
    }

    MyPagerAdapter 代码

    public class MyPagerAdapter extends PagerAdapter {
        private List<View>list;
        public MyPagerAdapter(List<View>list){
            this.list=list;
        }
        @Override
        public int getCount() {
            if (list!=null && list.size()>0){
                return list.size();
            }else {
                return 0;
            }
        }
    
        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
            return view==object;
        }
    
        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            super.destroyItem(container, position, object);
            container.removeView((View)object);
        }
    
        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            container.addView(list.get(position));
            return list.get(position);
    
        }
    
        @Override
        public int getItemPosition(@NonNull Object object) {
            return POSITION_NONE;
        }
    }
    
    
    ShowImageActivity 代码
    public class ShowImageActivity extends AppCompatActivity {
        private ViewPager viewPager;
        private List<View> listviews=null;
        private int index=0;
        private MyPagerAdapter adapter;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.show_image_layout);
            init();
        }
        private class PageChangeListener implements ViewPager.OnPageChangeListener{
            @Override
            public void onPageScrollStateChanged(int state) {
    
            }
    
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
            }
    
            @Override
            public void onPageSelected(int position) {
                index=position;
            }
        }
        private void init(){
            final Intent intent=getIntent();
            viewPager=findViewById(R.id.show_view_pager);
            listviews=new ArrayList<View>();
            for (int i=0;i<intent.getIntArrayExtra("image").length;i++){
                View view= LayoutInflater.from(getApplicationContext())
                        .inflate(R.layout.view_pager_item,null);
                ImageView iv =view.findViewById(R.id.view_image);
                iv.setBackgroundResource(intent.getIntArrayExtra("image")[i]);
                listviews.add(view);
                iv.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        Toast.makeText(ShowImageActivity.this,"这是第"+intent+1+"图片",Toast.LENGTH_SHORT).show();
                        return false;
                    }
                });
                adapter=new MyPagerAdapter(listviews);
                viewPager.setAdapter(adapter);
                viewPager.setOnPageChangeListener(new PageChangeListener());
                viewPager.setCurrentItem(intent.getIntExtra("id",0));
            }
    
        }
    }

    还有布局代码和图片就不一一往上发了,需要的可以找我要。

     

     

     

    展开全文
  • flutter 仿微信朋友发布图片

    千次阅读 2019-12-05 17:46:48
    控件类, 里面放了很多自己写的一些组件,所以有很多相机用不...另外也可以传网络图片进去显示,格式为: PhotoFrame(imagesShow:_imagesShow); _imagesShow = [ {id: 60, image: https://www.tricklen.com/p...
  • Android仿微信朋友上传图片

    千次阅读 2017-02-21 15:29:48
    android 朋友上传图片
  • 一键转发按钮,直接把多张图片拉起朋友,自动填充图片,或者多张图片发给好友,文字可以复制过去直接粘贴, 实现思路: 1.先把接口请求下来的多张图片保存到本地,这里是用Glide做的本地缓存 //缓存图片到...
  • 这两天做开发,需要将图片资源做成圆形,并且要对图片进行缩放,研究了半天,终于整出来了,效果如下: 代码如下: package com.android.mywidget; import android.content.Context; import android...
  • 微信仿朋友添加图片

    千次阅读 2017-12-05 15:04:05
    微信仿朋友添加图片 问题: 添加过多图片时,会出现OOM。如何动态修改图片展示栏的高度。加号如何伴随图片的增加而后移。如何保证最多添加照片为9张。 添加过多图片时,会出现OOM 出现第一种情况的...
  • 有段时间闲来没事的时候,想研究一下微信朋友图片点击效果,一开始的感觉是用跳转activity去实现。但是后面为了封装而好用。于是自己重新写了一个类,封装其它们。 我是准备用PopupWindow来做整体框架;简单来...
  • 仿微信朋友发表图片拖拽和删除功能

    万次阅读 多人点赞 2017-07-13 14:58:06
    仿微信朋友发表图片拖拽和删除功能,使用ItemTouchHelper实现拖拽和删除功能,并解决图片OOM,从分析到实现代码。
  • 如图所示,想要增加外显示每个模块的百分比分布,这个用R能做到吗?希望有大佬能帮忙解答,感谢!![图片说明](https://img-ask.csdn.net/upload/201712/31/1514726982_459593.png)
  • Android仿微信朋友圈图片查看器

    万次阅读 多人点赞 2014-10-20 00:02:21
    看博文之前,希望大家先打开自己的微信点到朋友中去,仔细观察是不是发现朋友里的有个“九宫格”的图片区域,点击图片又会跳到图片的详细查看页面,并且支持图片的滑动和缩放?这个功能是不是很常用呢?!那么我...
  • Android 仿微信朋友9宫格图片展示&多选图片

    万次阅读 热门讨论 2016-03-31 14:50:44
    最近的一个项目中,有一个类似于朋友的小模块,发现里面有几个技术点网上记录的并不多,值得记录一下,于是把两个主要的功能给抽取成了一个Demo,分享给大家希望对大家有所帮助。
  • 最新项目需求展示图片,在网上找了一,发现这个比较好用,和大家分享一下。但是还有个图片的点击滑动查看功能,等我找到后会在发布博客的 二、使用方法 1、核心类是NineGridLayout,继承自ViewGroup的抽象类,...
  • 仿朋友圈图片显示

    2017-08-01 09:07:29
    很多项目都会有一个功能,就是仿朋友一样的动态显示,但这个里面有个问题就是图片的摆放是怎样的呢?用recycleView ,用GrideView?在实际过程中,根据不同项目要求不一样的,以上两种有些时候是不太方便做好图片...
  • ![图片说明](https://img-ask.csdn.net/upload/202004/28/1588041562_186906.png) 借鉴的别人的代码
  • Vue+PHP+MySQL实现一次性多图片上传,js上传多张图片预览,QQ空间朋友微博图片动态发表(下) 1.功能描述 回顾 上篇博客说的是Vue+PHP一次性上传多张图片 ... 前端使用 fileReader 对象,通过 readAsDataUrl 方法...
  • //Toast.makeText(mContext, R.string.no_found, Toast.LENGTH_SHORT).show(); return; } cursor.moveToFirst(); String path = cursor.getString(cursor .getColumnIndex(MediaStore....
  • 项目上线由于图片各异,最近会偶尔出现分享到朋友时候根本就打不开share的界面,但是到微信聊天是可以;下面贴出先前的代码:Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_img);...
  • 微信查看朋友圈图片源码

    千次阅读 2016-10-27 09:58:33
    现在市场的应用都会有查看头像或者照片墙的功能,很简单的一个功能,但是呢,你可以打开市场上的应用比较一下,其实微信的查看图片功能做的非常不错,今天就实现类似于微信的查看图片的功能实现的效果
  • 下篇链接:一起撸个朋友吧 - 图片浏览(中)【图片浏览器】 前言 终于,这个系列的文章进入了全新的篇章,咱们的朋友系列进入研磨阶段,目前我们可以成功展示数据,可以进行点赞或者取消点赞,可以进行评...
  • 最近在项目中有一个用户反馈的功能中要上传图片,和微信发朋友添加图片的功能其实有点类似,所以我想着用GridView来实现这个功能,整个过程也很简单,画不多说,详细步骤见下: 1.先来看MainActivity的布局文件:...
  • 现在呢要对该照片墙中的图片进行点击放大的效果,就像朋友中的图片点击放大一样,有几点要求如下: 1)点击图片可以显示该图片的放大效果 2)图片可以左右滑动 3)图片可以点击缩放,手势自由缩放 4)点击图片...
  • 使用Imageloader+CircleImageview+PhotoView+ViewPager实现类似微信朋友效果,图片缩放查看以及切换。。。
  • 1、true分享好友,false分享朋友 class ShareActivity : AppCompatActivity() { private val imageUris: ArrayList<Uri> = ArrayList() override fun onCreate(savedInstanceState: Bundle?) { ...
  • 微信朋友图片上传,多图上传怎么去撸才合适?我们一起来实现吧! 图片上传是非常常见的功能,而多图上传在大多数应用中也是非常常见的,比如微信的朋友,微博的动态,都是有九宫格图片的,那这里肯定涉及了...
  • 本demo使用七牛上传来做的图片,视频上传.别的先不说,先上效果图 , 不想看的也可以直接拖到最下面进入我的github下载, 第一步:build.gradle里面导入: compile ‘top.zibin:Luban:1.0.9’ //luban进行图片压缩 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,869
精华内容 11,947
关键字:

圈r图片