Android视频的放大和缩小

Android视频的放大和缩小

这个还是在很久以前的时候写的,当时公司有一个需求,就是需要仿360或者是小蚁的app,做一个视频的放大缩小,当时是搜遍了,搜到的都是关于图片的放大缩小等,无奈之下,就自己去研究了一下,布局啊,自定义控件啊,手势啊,话说好久都没有做过纯上层的开发,现在做的智能家居一块的产品,更多的是倾向于底层着一块的实现,现在趁还没有怎么忘记,就把当时写的东西粘出来分享出来吧,希望能给大家啊一点小的帮助;
主要涉及到的东西就是滑动的算法,onLayout的使用,android系统手势的操作,自定义控件的开发等。
也写了好久了:不赘述,直接上代码:

这是自定义的CustomSurfaceView

package com.example.surfaceviewdemo;
import android.content.Context;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.util.Log;
import android.view.GestureDetector;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

public class CustomSurfaceView extends SurfaceView {

    public static final String TAG = "MyGesture";

    GestureDetector mGestureDetector = null;

    ScaleGestureDetector scaleGestureDetector = null;

    private int screenHeight = 0;

    private int screenWidth = 0;

    /** 记录是拖拉照片模式还是放大缩小照片模式 */
    private int mode = 0;// 初始状态
    /** 拖拉照片模式 */
    private static final int MODE_DRAG = 1;
    /** 放大缩小照片模式 */
    private static final int MODE_ZOOM = 2;

    private static final int MODE_DOUBLE_CLICK = 3;

    private long firstTime = 0;

    private static final float SCALE_MAX = 4.0f;

    private static float touchSlop = 0;

    private int start_Top = -1, start_Right = -1, start_Left = -1, start_Bottom = -1;

    private int start_x, start_y, current_x, current_y;

    View view;

    private int View_Width = 0;

    private int View_Height = 0;

    private int initViewWidth = 0;

    private int initViewHeight = 0;

    private int fatherView_W;

    private int fatherView_H;

    private int fatherTop;

    private int fatherBottom;

    int distanceX = 0;

    int distanceY = 0;

    private boolean isControl_Vertical = false;

    private boolean isControl_Horizal = false;

    private float ratio = 0.3f;

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

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

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

    @SuppressWarnings("deprecation")
    private void init() {
        touchSlop = ViewConfiguration.getTouchSlop();
        this.setFocusable(true);
        this.setClickable(true);
        this.setLongClickable(true);
        view = CustomSurfaceView.this;
        screenHeight = ScreenUtils.getScreenHeight(getContext());
        screenWidth = ScreenUtils.getScreenWidth(getContext());
        scaleGestureDetector = new ScaleGestureDetector(getContext(), new simpleScaleGestueListener());
        mGestureDetector = new GestureDetector(new simpleGestureListener());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mGestureDetector.onTouchEvent(event);
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            onTouchDown(event);
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            onPointerDown(event);
            break;
        case MotionEvent.ACTION_MOVE:
            onTouchMove(event);
            break;
        case MotionEvent.ACTION_UP:
            mode = 0;
            break;
        case MotionEvent.ACTION_POINTER_UP:
            mode = 0;
            break;
        default:
            break;
        }
        return scaleGestureDetector.onTouchEvent(event);
    }

    /**
     * 滑动事件分发
     * 
     * @param event
     */
    private void onTouchMove(MotionEvent event) {
        int left = 0, top = 0, right = 0, bottom = 0;
        if (mode == MODE_DRAG) {
            left = getLeft();
            right = getRight();
            top = getTop();
            bottom = getBottom();
            distanceX = (int) (event.getRawX() - current_x);
            distanceY = (int) (event.getRawY() - current_y);
            if(icallBack!=null){
                icallBack.getAngle((int)getX(),this.getWidth());
            }
            if (touchSlop <= getDistance(distanceX, distanceY)) {
                left = left + distanceX;
                right = right + distanceX;
                bottom = bottom + distanceY;
                top = top + distanceY;
                // 水平判断
                if (isControl_Horizal) {
                    if (left >= 0) {
                        left = 0;
                        right = this.getWidth();
                    }
                    if (right <= screenWidth) {
                        left = screenWidth - this.getWidth();
                        right = screenWidth;
                    }
                } else {
                    left = getLeft();
                    right = getRight();
                }
                // 垂直判断
                if (isControl_Vertical) {
                    if (top > 0) {
                        top = 0;
                        bottom = this.getHeight();
                    }
                    if (bottom <= start_Bottom) {
                        bottom = start_Bottom;
                        top = fatherView_H - this.getWidth();
                    }
                } else {
                    top = this.getTop();
                    bottom = this.getBottom();
                }
                if (isControl_Horizal || isControl_Vertical) {
                    this.setPosition(left, top, right, bottom);
                }
                current_x = (int) event.getRawX();
                current_y = (int) event.getRawY();
            }
        }
    }

    /**
     * 多点触控时
     * 
     * @param event
     */
    private void onPointerDown(MotionEvent event) {
        if (event.getPointerCount() == 2) {
            mode = MODE_ZOOM;
        }
    }

    /**
     * 按下时的事件
     * 
     * @param event
     */

    private void onTouchDown(MotionEvent event) {
        mode = MODE_DRAG;
        start_x = (int) event.getRawX();
        start_y = (int) event.getRawY();
        current_x = (int) event.getRawX();
        current_y = (int) event.getRawY();
        View_Width = getWidth();
        View_Height = getHeight();
        if (View_Height > fatherView_H) {
            isControl_Vertical = true;
        } else {
            isControl_Vertical = false;
        }
        if (View_Width > fatherView_W) {
            isControl_Horizal = true;
        } else {
            isControl_Horizal = false;
        }
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        if (start_Top == -1) {
            start_Top = top;
            start_Left = left;
            start_Right = right;
            start_Bottom = bottom;
            initViewWidth = view.getWidth();
            initViewHeight = view.getHeight();
        }
    }

    /**
     * 缩放手势的监听事件
     * 
     * @author Administrator
     * 
     */
    private class simpleScaleGestueListener implements ScaleGestureDetector.OnScaleGestureListener {
        // 用到的放大缩小的方法
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            int left = 0, right = 0, top = 0, bottom = 0;
            float length = 0;
            if (mode == MODE_ZOOM) {
                float ratio = detector.getScaleFactor();
                left = getLeft();
                top = getTop();
                bottom = getBottom();
                right = getRight();
                if (ratio > 1) { // 放大撞状态
                    length = (int) ((getHeight() * (ratio - 1)) / 7.0);
                    left = (int) (left - length / 2);
                    right = (int) (right + length / 2);
                    bottom = (int) (bottom + length / 2);
                    top = (int) (top - length / 2);
                    if (getWidth() <= (screenWidth * 3) && getHeight() <= (fatherView_H * 3)) {
                        setPosition(left, top, right, bottom);
                    }
                } else {
                    length = (int) ((getHeight() * (1 - ratio)) / 7.0);
                    left = (int) (left + length / 2);
                    right = (int) (right - length / 2);
                    bottom = (int) (bottom - length / 2);
                    top = (int) (top + length / 2);
                    if (left >= 0) {
                        left = 0;
                    }
                    if (right <= screenWidth) {
                        right = screenWidth;
                    }
                    if (top >= 0) {
                        top = 0;
                    }
                    if (bottom <= fatherView_H) {
                        bottom = fatherView_H;
                    }
                    if (getWidth() > initViewWidth && getHeight() > fatherView_H) {
                        setPosition(left, top, right, bottom);
                    } else {
                        setPosition(start_Left, start_Top, start_Right, start_Bottom);
                    }
                }
            }
            return false;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            return true;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {

        }

    }

    /**
     * 双击事件的处理
     * 
     * @author Administrator
     * 
     */
    private class simpleGestureListener extends GestureDetector.SimpleOnGestureListener {
        // 用到的双击的方法
        public boolean onDoubleTap(MotionEvent e) {
            Log.i(TAG, "双击屏幕");
            // 双击屏幕
            int left = 0, top = 0, right = 0, bottom = 0;
            int length = 0;
            left = getLeft();
            top = getTop();
            bottom = getBottom();
            right = getRight();
            if (getHeight() > fatherView_H) {
                // 缩小模式
                Log.i(TAG, "缩小模式");
                while (getHeight() > fatherView_H) {
                    length = (int) ((getHeight() * ratio) / 5.0);
                    left = (int) (getLeft() + length / 2);
                    right = (int) (getRight() - length / 2);
                    bottom = (int) (getBottom() - length / 2);
                    top = (int) (getTop() + length / 2);
                    if (left >= 0) {
                        left = 0;
                    }
                    if (right <= screenWidth) {
                        right = screenWidth;
                    }
                    if (top >= 0) {
                        top = 0;
                    }
                    if (bottom <= fatherView_H) {
                        bottom = fatherView_H;
                    }
                    if (getWidth() > initViewWidth && getHeight() > fatherView_H) {
                        setPosition(left, top, right, bottom);
                    } else {
                        setPosition(start_Left, start_Top, start_Right, start_Bottom);
                    }
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                }
            } else {
                // 放大模式
                Log.i(TAG, "放大模式");
                if (getHeight() <= fatherView_H) {
                    while (getHeight() < initViewHeight * 2) {
                        length = (int) ((getHeight() * ratio) / 5.0);
                        left = (int) (getLeft() - length / 2);
                        right = (int) (getRight() + length / 2);
                        bottom = (int) (getBottom() + length / 2);
                        top = (int) (getTop() - length / 2);
                        if (getWidth() <= (screenWidth * 3) && getHeight() <= (fatherView_H * 3)) {
                            setPosition(left, top, right, bottom);
                        }
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }
                    }
                }
            }
            return true;
        }

    }

    /** 实现拖动的处理 */
    private void setPosition(int left, int top, int right, int bottom) {
        this.layout(left, top, right, bottom);

    }

    /**
     * surfaceView父控件的宽高
     * 
     * @param fatherView_Width
     * @param fatherView_Height
     */
    public void setFatherW_H(int fatherView_Width, int fatherView_Height) {
        this.fatherView_W = fatherView_Width;
        this.fatherView_H = fatherView_Height;
    }

    public void setLayoutParam(float scale) {
        LinearLayout.LayoutParams layoutParams = (LayoutParams) getLayoutParams();
        layoutParams.gravity = Gravity.CENTER;
        layoutParams.width = (int) (scale * (layoutParams.width));
        layoutParams.height = (int) (scale * (layoutParams.height));
        setLayoutParams(layoutParams);
    }

    /** 获取两点的距离 **/
    private float getDistance(float distanceX, float distanceY) {
        return FloatMath.sqrt(distanceX * distanceX + distanceY * distanceY);
    }

    public void setFatherTopAndBottom(int fatherTop, int fatherBottom) {
        this.fatherTop = fatherTop;
        this.fatherBottom = fatherBottom;
    }

     /**
     * 一定一个接口
     */
    public interface ICoallBack {
        void getAngle(int angle, int viewW);
    }

    /**
     * 初始化接口变量
     */
    ICoallBack icallBack = null;

    /**
     * 自定义控件的自定义事件
     */
    public void setEvent(ICoallBack iBack) {
        icallBack = iBack;
    }

}

仿360的那个小滑动条

package com.example.surfaceviewdemo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;


public class CustomMonitorMenu extends View {
    public final int R1 = 100;
    public final int R2 = 8;

    //每一格 cos y的差距
    public float width;
    public float height;
    public float screenWidth;
    public float screenHeight;

    public int startAngle = 235;  //新的角度 开始时30
    public float initialAngle = 0.1f;  //初始弧度30
    public int sweepAngle = 70;  //角度

    public double newX;
    public double newY;   //给小圆球提供位置 空间移动到这个位置上面去

    public Paint mPaint2;
    public Paint mPaint3;
    public Paint mPaint4;
    public boolean flag = false;
    public Paint mPaint;
    public Context mContext;
    public String Sangle = "0";
    public String Eangle = "120";

    /**
     * 一定一个接口
     */
    public interface ICoallBack {
        void getAngle(int angle);
    }

    /**
     * 初始化接口变量
     */
    ICoallBack icallBack = null;

    /**
     * 自定义控件的自定义事件
     */
    public void setEvent(ICoallBack iBack) {
        icallBack = iBack;
    }


    public CustomMonitorMenu(Context context) {
        super(context);
        this.mContext = context;
        this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        initView();
//      setWillNotDraw(false);
    }

    public CustomMonitorMenu(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        initView();
//      setWillNotDraw(false);

    }

    public void setindex(int initAng, int viewW) {
        int viewX = (int) (viewW - screenWidth);
        if (viewX != 0) {
            initialAngle = Math.abs(initAng) * sweepAngle / viewX;
        }else {
            viewW = 1;
        }

        if (initialAngle >= 0 && initialAngle <= 70) {
            initialAngle = 35 - initialAngle;
        }
        Log.e("hgz------->", " initAng = " + Math.abs(initAng) + " initialAngle = " + initialAngle + " viewX = " + viewX);
        invalidate();
    }

    private void initView() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(Color.BLACK);
        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(2.0f);
        mPaint.setStyle(Paint.Style.STROKE);

        mPaint2 = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿
        mPaint2.setColor(Color.BLACK);
        mPaint2.setStrokeWidth(2.0f);
        mPaint2.setStrokeJoin(Paint.Join.ROUND); // 让画的线圆滑
        mPaint2.setStrokeCap(Paint.Cap.ROUND);

        mPaint3 = new Paint();
        mPaint3.setColor(Color.BLACK);
        mPaint3.setStrokeWidth(2.0f);
        mPaint3.setStyle(Paint.Style.STROKE);
        mPaint3.setAntiAlias(true);

        mPaint4 = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint4.setStrokeWidth(1);
        mPaint4.setTextSize(16);
        mPaint4.setStyle(Paint.Style.STROKE);
        mPaint4.setColor(Color.BLACK);
// 下面这行是实现水平居中,drawText对应改为传入targetRect.centerX()
//      mPaint4.setTextAlign(Paint.Align.CENTER);

//        根据屏幕的宽高确定圆心的坐标
        DisplayMetrics metric = new DisplayMetrics();
        ((MainActivity) mContext).getWindowManager().getDefaultDisplay().getMetrics(metric);
//      屏幕的宽高

        screenWidth = metric.widthPixels;
        screenHeight = metric.heightPixels;
//       圆心位置坐标

        width = metric.widthPixels / 2.0f;
        height = metric.heightPixels / 8.0f;

        Log.e("aaa--->圆心的坐标:", width + "---" + height);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        RectF oval1 = new RectF(width - 100, height - 100, width + 100, height + 100);
        canvas.drawArc(oval1, startAngle, sweepAngle, false, mPaint);//小弧形
        Log.e("ooo--->", "圆环的圆心的坐标 : width " + width + "   height " + height);


//        getNewLocation(initialAngle); //根据判断 来移动小球 获得新的位置

        canvas.drawLine(width, (height - R1), width, (height - R1) + 10, mPaint3);


        canvas.drawText(Sangle, (float) (width - Math.sin(35 * Math.PI / 180) * R1) - 20, (float) (height - Math.cos(35 * Math.PI / 180) * R1) + 10, mPaint4);
        canvas.drawText(Eangle, (float) (width + Math.sin(35 * Math.PI / 180) * R1) + 8, (float) (height - Math.cos(35 * Math.PI / 180) * R1) + 10, mPaint4);

//        canvas.drawCircle((float) newX, (float) newY, R2, mPaint2);


        canvas.drawLine((float) (width - Math.sin(35 * Math.PI / 180) * R1), (float) (height - Math.cos(35 * Math.PI / 180) * R1),
                (float) (width - Math.sin(35 * Math.PI / 180) * R1) - 5.0f, (float) (height - Math.cos(35 * Math.PI / 180) * R1) - 6.0f, mPaint3);
        canvas.drawLine((float) (width - Math.sin(35 * Math.PI / 180) * R1), (float) (height - Math.cos(35 * Math.PI / 180) * R1),
                (float) (width - Math.sin(35 * Math.PI / 180) * R1) + 5.0f, (float) (height - Math.cos(35 * Math.PI / 180) * R1) + 6.0f, mPaint3);

        canvas.drawLine((float) (width + Math.sin(35 * Math.PI / 180) * R1), (float) (height - Math.cos(35 * Math.PI / 180) * R1),
                (float) (width + Math.sin(35 * Math.PI / 180) * R1) + 5.0f, (float) (height - Math.cos(35 * Math.PI / 180) * R1) - 6.0f, mPaint3);
        canvas.drawLine((float) (width + Math.sin(35 * Math.PI / 180) * R1), (float) (height - Math.cos(35 * Math.PI / 180) * R1),
                (float) (width + Math.sin(35 * Math.PI / 180) * R1) - 5.0f, (float) (height - Math.cos(35 * Math.PI / 180) * R1) + 6.0f, mPaint3);

//        canvas.drawCircle((float) (width - Math.sin(35 * Math.PI / 180) * R1), (float) (height - Math.cos(35 * Math.PI / 180) * R1), R2, mPaint2);

        canvas.drawCircle((float) (width - Math.sin(initialAngle * Math.PI / 180) * R1), (float) (height - Math.cos(initialAngle * Math.PI / 180) * R1), R2, mPaint2);

        Log.e("hgz", "小球的坐标:" + (float) (width - Math.sin(initialAngle * Math.PI / 180) * R1) + "     " + (float) (height - Math.cos(initialAngle * Math.PI / 180) * R1));
//        canvas.drawCircle((float) (width + Math.sin(35 * Math.PI / 180) * R1), (float) (height - Math.cos(35 * Math.PI / 180) * R1), R2, mPaint2);
    }

}

ScreenUtils尺寸工具类

package com.example.surfaceviewdemo;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;

public class ScreenUtils {
     private ScreenUtils()  
        {  
            /* cannot be instantiated */  
            throw new UnsupportedOperationException("cannot be instantiated");  
        }  

        /** 
         * 获得屏幕高度 
         *  
         * @param context 
         * @return 
         */  
        public static int getScreenWidth(Context context)  
        {  
            WindowManager wm = (WindowManager) context  
                    .getSystemService(Context.WINDOW_SERVICE);  
            DisplayMetrics outMetrics = new DisplayMetrics();  
            wm.getDefaultDisplay().getMetrics(outMetrics);  
            return outMetrics.widthPixels;  
        }  

        /** 
         * 获得屏幕宽度 
         *  
         * @param context 
         * @return 
         */  
        public static int getScreenHeight(Context context)  
        {  
            WindowManager wm = (WindowManager) context  
                    .getSystemService(Context.WINDOW_SERVICE);  
            DisplayMetrics outMetrics = new DisplayMetrics();  
            wm.getDefaultDisplay().getMetrics(outMetrics);  
            return outMetrics.heightPixels;  
        }  

        /** 
         * 获得状态栏的高度 
         *  
         * @param context 
         * @return 
         */  
        public static int getStatusHeight(Context context)  
        {  

            int statusHeight = -1;  
            try  
            {  
                Class<?> clazz = Class.forName("com.android.internal.R$dimen");  
                Object object = clazz.newInstance();  
                int height = Integer.parseInt(clazz.getField("status_bar_height")  
                        .get(object).toString());  
                statusHeight = context.getResources().getDimensionPixelSize(height);  
            } catch (Exception e)  
            {  
                e.printStackTrace();  
            }  
            return statusHeight;  
        }  

        /** 
         * 获取当前屏幕截图,包含状态栏 
         *  
         * @param activity 
         * @return 
         */  
        public static Bitmap snapShotWithStatusBar(Activity activity)  
        {  
            View view = activity.getWindow().getDecorView();  
            view.setDrawingCacheEnabled(true);  
            view.buildDrawingCache();  
            Bitmap bmp = view.getDrawingCache();  
            int width = getScreenWidth(activity);  
            int height = getScreenHeight(activity);  
            Bitmap bp = null;  
            bp = Bitmap.createBitmap(bmp, 0, 0, width, height);  
            view.destroyDrawingCache();  
            return bp;  

        }  

        /** 
         * 获取当前屏幕截图,不包含状态栏 
         *  
         * @param activity 
         * @return 
         */  
        public static Bitmap snapShotWithoutStatusBar(Activity activity)  
        {  
            View view = activity.getWindow().getDecorView();  
            view.setDrawingCacheEnabled(true);  
            view.buildDrawingCache();  
            Bitmap bmp = view.getDrawingCache();  
            Rect frame = new Rect();  
            activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);  
            int statusBarHeight = frame.top;  

            int width = getScreenWidth(activity);  
            int height = getScreenHeight(activity);  
            Bitmap bp = null;  
            bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height  
                    - statusBarHeight);  
            view.destroyDrawingCache();  
            return bp;  

        }  
}

主Activity

package com.example.surfaceviewdemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class SplashActivity extends Activity{
    Button btnstartPortActivity;
    Button btnstartLandActivity;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_layout);
        btnstartLandActivity = (Button) findViewById(R.id.start_landscape_activity);
        btnstartPortActivity = (Button) findViewById(R.id.start_portable_activity);

        btnstartPortActivity.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SplashActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });
        btnstartLandActivity.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SplashActivity.this,DemoActivty.class);
                startActivity(intent);
            }
        });


    }
}

纵屏播放Activity

package com.example.surfaceviewdemo;

import java.io.IOException;

import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

import com.example.surfaceviewdemo.CustomSurfaceView.ICoallBack;

public class MainActivity extends Activity {
    public static final String TAG = "MyGesture";

    Button btn_start;
    Button btn_end;
    CustomSurfaceView customSurfaceView;
    private SurfaceHolder surfaceHolder;
    private MediaPlayer mediaPlayer;
    String pathVideo;
    LinearLayout line_view;

    private int fatherView_W;

    private int fatherView_H;

    CustomMonitorMenu customMonitorMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_start = (Button) findViewById(R.id.start_vedio);
        btn_end = (Button) findViewById(R.id.stop_vedio);
        line_view = (LinearLayout) findViewById(R.id.line_view);
        customSurfaceView = (CustomSurfaceView) findViewById(R.id.hv_scrollView);
        LayoutParams layoutParams = (LayoutParams) customSurfaceView.getLayoutParams();
        layoutParams.width = (int) (ScreenUtils.getScreenWidth(getApplicationContext()) * (1.2));
        layoutParams.gravity = Gravity.CENTER;
        customMonitorMenu = (CustomMonitorMenu) findViewById(R.id.custom_Menu);
        customSurfaceView.setLayoutParams(layoutParams);
        initgetViewW_H();
        btn_start.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                playSurfaceView();
            }
        });

        btn_end.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                stopSurfaceView();
            }
        });
        surfaceHolder = customSurfaceView.getHolder();
        surfaceHolder.setFixedSize(800, 800);
        surfaceHolder.setKeepScreenOn(true);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                    mediaPlayer.stop();
                }
            }
        });
        customSurfaceView.setEvent(new ICoallBack() {

            @Override
            public void getAngle(int angle, int viewW) {
                if (customMonitorMenu != null) {
                    customMonitorMenu.setindex(angle, viewW);
                }
            }
        });
    }

    private void initgetViewW_H() {
        line_view.postDelayed(new Runnable() {
            @Override
            public void run() {
                fatherView_W = line_view.getWidth();
                fatherView_H = line_view.getHeight();
                Log.i(TAG, "father Top" + line_view.getTop());
                Log.i(TAG, "father Bottom" + line_view.getBottom());
                customSurfaceView.setFatherW_H(line_view.getTop(), line_view.getBottom());
                customSurfaceView.setFatherTopAndBottom(line_view.getTop(), line_view.getBottom());
            }
        }, 100);
    }

    // 鏆傚仠
    public void stopSurfaceView() {
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }

    // 寮�濮嬫挱鏀捐棰�
    public void playSurfaceView() {
        try {
            if (mediaPlayer == null) {
                mediaPlayer = new MediaPlayer();
            }
            mediaPlayer.reset();
            AssetFileDescriptor in = getResources().getAssets().openFd("hgz.mp4");
            mediaPlayer.setDataSource(in.getFileDescriptor(), in.getStartOffset(), in.getLength());
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setDisplay(surfaceHolder);
            mediaPlayer.prepare();
            mediaPlayer.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

横屏幕播放Activity

package com.example.surfaceviewdemo;

import java.io.IOException;

import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

public class DemoActivty extends Activity {
    public static final String TAG = "MyGesture";

    Button btn_start;
    Button btn_end;
    CustomSurfaceView customSurfaceView;
    private SurfaceHolder surfaceHolder;
    private MediaPlayer mediaPlayer;
    String pathVideo;
    LinearLayout line_view;

    private int fatherView_W;

    private int fatherView_H;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.demo_layout);
        btn_start = (Button) findViewById(R.id.start_vedio);
        btn_end = (Button) findViewById(R.id.stop_vedio);
        line_view = (LinearLayout) findViewById(R.id.line_view);
        customSurfaceView = (CustomSurfaceView) findViewById(R.id.hv_scrollView);
        LayoutParams layoutParams = (LayoutParams) customSurfaceView.getLayoutParams();
        layoutParams.gravity = Gravity.CENTER;
        customSurfaceView.setLayoutParams(layoutParams);
        initgetViewW_H();
        btn_start.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                playSurfaceView();
            }
        });

        btn_end.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                stopSurfaceView();
            }
        });
        surfaceHolder = customSurfaceView.getHolder();
        surfaceHolder.setFixedSize(800, 800);
        surfaceHolder.setKeepScreenOn(true);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                    mediaPlayer.stop();
                }
            }
        });

    }

    private void initgetViewW_H() {
        line_view.postDelayed(new Runnable() {
            @Override
            public void run() {
                fatherView_W = line_view.getWidth();
                fatherView_H = line_view.getHeight();
                Log.i(TAG, "father Top" + line_view.getTop());
                Log.i(TAG, "father Bottom" + line_view.getBottom());
                customSurfaceView.setFatherW_H(line_view.getTop(), line_view.getBottom());
                customSurfaceView.setFatherTopAndBottom(line_view.getTop(), line_view.getBottom());
            }
        }, 100);
    }

    // 鏆傚仠
    public void stopSurfaceView() {
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }

    // 寮�濮嬫挱鏀捐棰�
    public void playSurfaceView() {
        try {
            if (mediaPlayer == null) {
                mediaPlayer = new MediaPlayer();
            }
            mediaPlayer.reset();
            AssetFileDescriptor in = getResources().getAssets().openFd("hgz.mp4");
            mediaPlayer.setDataSource(in.getFileDescriptor(), in.getStartOffset(), in.getLength());
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setDisplay(surfaceHolder);
            mediaPlayer.prepare();
            mediaPlayer.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

因为这个代码写了已经有八九个月了,之前很多东西都是总结在有道云笔记当中,这段时间把它转移到Csdn上来,所以才把它拿出来,可能也有些写的不好,希望吧 能给大家一点帮助,源代码是可以直接run的,

源代码地址:源码地址

如果有什么疑问的或者缺陷的地方也可以及时联系作者

谢谢大家的观看

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 中进行视频放大缩小操作,可以使用 TextureView 和 ScaleGestureDetector 类。TextureView 是一个可以用来显示视频的控件,而 ScaleGestureDetector 可以监测两个手指之间的距离变化,并据此进行缩放操作。以下是一个简单的示例代码,可以将 TextureView 控件进行放大缩小操作: ```java public class MainActivity extends AppCompatActivity { private TextureView mTextureView; private MediaPlayer mMediaPlayer; private ScaleGestureDetector mScaleGestureDetector; private float mScaleFactor = 1.0f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextureView = findViewById(R.id.texture_view); mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) { try { AssetFileDescriptor afd = getAssets().openFd("video.mp4"); mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); mMediaPlayer.setSurface(new Surface(surfaceTexture)); mMediaPlayer.prepare(); mMediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { } }); mScaleGestureDetector = new ScaleGestureDetector(this, new ScaleListener()); } @Override public boolean onTouchEvent(MotionEvent event) { mScaleGestureDetector.onTouchEvent(event); return true; } private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScale(ScaleGestureDetector detector) { mScaleFactor *= detector.getScaleFactor(); mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f)); mTextureView.setScaleX(mScaleFactor); mTextureView.setScaleY(mScaleFactor); return true; } } } ``` 在这个示例代码中,我们在 onCreate() 方法中获取了一个 TextureView 控件,并创建了一个 ScaleGestureDetector 对象。然后,我们在 TextureView 的 SurfaceTextureListener 中创建了一个 MediaPlayer 对象,并将其与 TextureView 控件进行关联,以实现视频的播放。注意,在这个示例代码中,我们假设视频文件名为 video.mp4,并将其放在 app/src/main/assets 目录下。 我们还重写了 onTouchEvent() 方法,并在其中调用 ScaleGestureDetector 对象的 onTouchEvent() 方法,以便进行缩放操作。 最后,我们定义了一个 ScaleListener 类,用于监测缩放操作,并在缩放时调整 TextureView 控件的缩放比例。在 onScale() 方法中,我们使用了 detector.getScaleFactor() 方法获取缩放因子,然后将其乘以当前的缩放比例,并在最后使用 Math.max() 和 Math.min() 方法确保缩放比例在合理的范围内。最后,我们使用 setScaleX() 和 setScaleY() 方法设置 TextureView 控件的缩放比例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值