android长截屏beta1

package com.example.wanjian.test;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Environment;
import android.os.SystemClock;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.LinearLayout;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by wanjian on 16/8/18.
 */
public class ScrollableViewRECUtil {

    public static final int VERTICAL = 0;


    private static final int DELAY = 2;

    private List<Bitmap> bitmaps = new ArrayList<>();

    private int orientation = VERTICAL;

    private View view;

    private boolean isEnd;

    private OnRecFinishedListener listener;

    public ScrollableViewRECUtil(View view, int orientation) {
        this.view = view;
        this.orientation = orientation;
    }

    public void start(final OnRecFinishedListener listener) {
        this.listener = listener;


        final MotionEvent motionEvent = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, view.getWidth() / 2, view.getHeight() / 2, 0);
        view.dispatchTouchEvent(motionEvent);
        motionEvent.setAction(MotionEvent.ACTION_MOVE);
        //滑动距离大于ViewConfiguration.get(view.getContext()).getScaledTouchSlop()时listview才开始滚动
        motionEvent.setLocation(motionEvent.getX(), motionEvent.getY() - (ViewConfiguration.get(view.getContext()).getScaledTouchSlop() + 1));
        view.dispatchTouchEvent(motionEvent);

        motionEvent.setLocation(motionEvent.getX(), view.getHeight() / 2);

        view.postDelayed(new Runnable() {
            @Override
            public void run() {

                if (isEnd) {

                    //停止时正好一屏则全部绘制,否则绘制部分
                    if ((view.getHeight() / 2 - (int) motionEvent.getY()) % view.getHeight() == 0) {
                        Bitmap bitmap = rec();
                        bitmaps.add(bitmap);
                    } else {

                        Bitmap origBitmap = rec();

                        int y = view.getHeight() / 2 - (int) motionEvent.getY();
                        Bitmap bitmap = Bitmap.createBitmap(origBitmap, 0, view.getHeight() - y % view.getHeight(), view.getWidth(), y % view.getHeight());
                        bitmaps.add(bitmap);

                        origBitmap.recycle();
                    }


                    //最后一张可能高度不足view的高度
                    int h = view.getHeight() * (bitmaps.size() - 1);
                    Bitmap bitmap = bitmaps.get(bitmaps.size() - 1);

                    h = h + bitmap.getHeight();

                    Bitmap result = Bitmap.createBitmap(view.getWidth(), h, Bitmap.Config.RGB_565);

                    Canvas canvas = new Canvas();
                    canvas.setBitmap(result);

                    for (int i = 0; i < bitmaps.size(); i++) {
                        Bitmap b = bitmaps.get(i);
                        canvas.drawBitmap(b, 0, i * view.getHeight(), null);
                        b.recycle();

                    }

                    listener.onRecFinish(result);


                    return;
                }

                if ((view.getHeight() / 2 - (int) motionEvent.getY()) % view.getHeight() == 0) {
                    Bitmap bitmap = rec();
                    bitmaps.add(bitmap);
                }


                motionEvent.setAction(MotionEvent.ACTION_MOVE);

                motionEvent.setLocation((int) motionEvent.getX(), (int) motionEvent.getY() - 1);

                view.dispatchTouchEvent(motionEvent);

                view.postDelayed(this, DELAY);

            }
        }, DELAY);
    }

    public void stop() {
        isEnd = true;
    }

    private Bitmap rec() {
        Bitmap film = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas();

        canvas.setBitmap(film);

        view.draw(canvas);


        return film;

    }

    public interface OnRecFinishedListener {
        void onRecFinish(Bitmap bitmap);
    }


}

activity 代码


  setContentView(R.layout.activity_main4);
//
        listview= (ListView) findViewById(R.id.listview);

        listview.setAdapter(new BaseAdapter() {
            @Override
            public int getCount() {
                return 100;
            }

            @Override
            public Object getItem(int position) {
                return null;
            }

            @Override
            public long getItemId(int position) {
                return 0;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                if (convertView==null){
                    Button button= (Button) LayoutInflater.from(getApplication()).inflate(R.layout.item,listview,false);
                    button.setText(""+position);
                    return button;
                }

                ((Button)convertView).setText(""+position);

                return convertView;
            }
        });
//

        File file=new File(Environment.getExternalStorageDirectory(),"aaa");
        file.mkdirs();

        for (File f:file.listFiles()){
            f.delete();
        }


        listview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                listview.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                start();
            }
        });

 private void start(){
        final View view=findViewById(R.id.view);

        final ScrollableViewRECUtil scrollableViewRECUtil=new ScrollableViewRECUtil(view,ScrollableViewRECUtil.VERTICAL);

        scrollableViewRECUtil.start(new ScrollableViewRECUtil.OnRecFinishedListener() {
            @Override
            public void onRecFinish(Bitmap bitmap) {
                File f= Environment.getExternalStorageDirectory();
                System.out.print(f.getAbsoluteFile().toString());
                Toast.makeText(getApplicationContext(),f.getAbsolutePath(),Toast.LENGTH_LONG).show();
                try {
                    bitmap.compress(Bitmap.CompressFormat.JPEG,60,new FileOutputStream(new File(f,"aaa/rec"+System.currentTimeMillis()+".jpg")));

                    Toast.makeText(getApplicationContext(),"Success",Toast.LENGTH_LONG).show();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });

        // scrollableViewRECUtil

        view.postDelayed(new Runnable() {
            @Override
            public void run() {
                scrollableViewRECUtil.stop();
            }
        },90*1000);
    }


布局代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:id="@+id/view"
    android:orientation="vertical"
 >

        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="#e1e1e1"
            android:dividerHeight="2dp"
            ></ListView>
</LinearLayout>


效果图  图1是屏幕   图2是截屏







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值