当前位置:编程学习 > wap >>

android拖动videoview进行视频交换的问题

例:
现在窗口下有两个VideoView正在播放视频。vv1和vv2
我拖动vv1到vv2的上方,或有交界处后,vv1和vv2进行互换位置和大小。

达到的效果是2个视频互换了位置。

这是交换的控件本身还是数据源?我知道是实现onTouch接口里的方法,可是具体该如何实现交换?

要保证2个视频不会间断,不会出现短暂黑屏。
android videoview 拖动 交换 --------------------编程问答-------------------- lz你用的什么渲染视频?
会不会出现拖动vv1到vv2的上方,但视频内容vv1还是在vv2下方的情况? --------------------编程问答--------------------
引用 1 楼 zjuzhengchao 的回复:
lz你用的什么渲染视频?
会不会出现拖动vv1到vv2的上方,但视频内容vv1还是在vv2下方的情况?


现在做到的是vv1可以拖动到vv2上方,但是松手后就回到了原处。
目前只是直接用videoview的setvideopath()播放本地视频来测试拖动效果,以后是在播放rtsp流的基础上实现拖动交换。 --------------------编程问答--------------------


package com.test;

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.FrameLayout;
import android.widget.VideoView;

public class MainActivity extends Activity implements OnTouchListener{
GestureDetector mGesture = null;
int eve;
int sl=0,sr=0,st=0,sb=0;
int lastX,lastY;
private FrameLayout ff_vv1;
private FrameLayout ff_vv2;
private VideoView vv1;
private VideoView vv2;
// private VideoView[] btns=new VideoView[2];
private FrameLayout[] btns = new FrameLayout[2];
private int mScremWidth,mScremHeight;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ff_vv1 = (FrameLayout)findViewById(R.id.frameLayout1);
        ff_vv2 = (FrameLayout)findViewById(R.id.frameLayout2);

        vv1 = (MyVideoView)findViewById(R.id.videoView1);
        vv2 = (MyVideoView)findViewById(R.id.videoView2);
        
        vv1.setVideoPath("sdcard/v1.mp4");
        vv1.start();
        vv1.setOnTouchListener(this);
        vv2.setOnTouchListener(this);
        ff_vv1.setOnTouchListener(this);
        ff_vv2.setOnTouchListener(this);
        btns[0] = ff_vv1;
        btns[1] = ff_vv2;
        
        DisplayMetrics dm=getResources().getDisplayMetrics();
        mScremWidth=dm.widthPixels;
        mScremHeight=dm.heightPixels-50;
        
        mGesture = new GestureDetector(this, new GestureListener()); 
    }

    
    private void changeset(View btnmove,MotionEvent event){
     int eve=event.getAction();
     switch (eve) {
     case MotionEvent.ACTION_DOWN:
     lastX=(int)event.getRawX();
     lastY=(int)event.getRawY();
     sl=btnmove.getLeft();
     sr=btnmove.getRight();
     st=btnmove.getTop();
     sb=btnmove.getBottom();
     btnmove.bringToFront();
     break;
     case MotionEvent.ACTION_MOVE:
     int dx=(int)event.getRawX()-lastX;
     int dy=(int)event.getRawY()-lastY;
     int l=btnmove.getLeft()+dx;
     int r=btnmove.getRight()+dx;
     int t=btnmove.getTop()+dy;
     int b=btnmove.getBottom()+dy;
     if(l<0){
     l=0;
     r=l+btnmove.getWidth();
     }
     if(r>mScremWidth){
     r=mScremWidth;
     l=r-btnmove.getWidth();
     }
     if(t<0){
     t=0;
     b=t+btnmove.getHeight();
     }
     if(b>mScremHeight){
     b=mScremHeight;
     t=b-btnmove.getHeight();
     }
     btnmove.layout(l, t, r, b);
     lastX=(int)event.getRawX();
     lastY=(int)event.getRawY();
     break;
     case MotionEvent.ACTION_UP:
     //无偏移坐标不变
     int tt=btnmove.getTop();
     if(Math.abs(tt-st)>9){
     int min=abstop(btnmove);
     FrameLayout btn=btns[min];
     if(btnmove.getId()!=btn.getId()){
     btnmove.layout(btn.getLeft(), btn.getTop(),btn.getRight(), btn.getBottom());
     btn.layout(sl, st, sr, sb);
     }else{
     Log.i("bbb","btnmove===btn"+btn.getId());
     btnmove.layout(sl, st, sr, sb);
     }
     }else{
     //无偏移坐标归原
     btnmove.layout(sl, st, sr, sb);
     }
     break;
    default:
     break;
     }
     }
     //算出非本按钮次小坐标
     private int abstop(View bt){
     int btl=bt.getBottom();
     int[] tops=new int[btns.length];
     Log.i("length", "btns.length="+btns.length);
     for(int i=0;i<btns.length;i++){
     int temp=btns[i].getBottom();
     int abs=Math.abs(btl-temp);
     Log.i("abs", "btns["+i+"],abs==="+abs);
     tops[i]=abs;
     }
     int min=0;
     int index=0;
     int indexz=0;
    for(int i=0;i<tops.length;i++){
     if(tops[i]==0){
     indexz=i;
     }
     }
     int[] temp=tops;
     for(int i=0;i<temp.length;i++){
     for(int j=i+1;j<temp.length;j++){
     if(temp[i]>temp[j]){
     int t=temp[i];
     temp[i]=temp[j];
     temp[j]=t;
     }
     }
     }
     ////确保都为0是temp[1]不是按钮本身 此处处理让不能底部重合
     if(temp[1]!=0){
     min=temp[1];
     }
     Log.i("min", "min=="+min);
     tops=new int[btns.length];
     Log.i("length", "btns.length="+btns.length);
     for(int i=0;i<btns.length;i++){
     int tem=btns[i].getBottom();
     int abs=Math.abs(btl-tem);
     Log.i("abs", "btns["+i+"],abs==="+abs);
     tops[i]=abs;
     }
    for(int i=0;i<tops.length;i++){
     if(tops[i]==min){
     index=i;
     }
     }
     Log.i("aaa", "index========================"+index);
     return index;
     }
    class GestureListener extends SimpleOnGestureListener{
     @Override
     public boolean onDown(MotionEvent e) {
     // TODO Auto-generated method stub
     return true;
     }
    }
    
public boolean onTouch(View v, MotionEvent event) {


// TODO Auto-generated method stub

eve=event.getAction();
     changeset(v,event);
return mGesture.onTouchEvent(event);
}
}
--------------------编程问答-------------------- 上面是我做测试的代码。刚改了些地方暂时没跑起来。大体上是这个意思,改回去就可以运行了。但是我觉得是不是算法有问题,所以交换不了位置呢。而且我这种方式不是交换的数据源,只是控件吧
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,