关于与SurfaceView重叠的控件的点击事件处理

yel_hb 2013-04-07 08:29:42
先描述背景:新手,纯的。
问题:我在SurfaceView上层放了一个linearlayout,SurfaceView作为底层的控件,用于绘图,linearlayout中有几个button,用于选择画笔的颜色,现在完成了3指点击显示或隐藏linearlayout。但是现在发现上面的按钮没法用。我觉得是没有拦截到点击事件,因为我在surfaceview中onTouchEvent()方法中直接return true了,也就没法传递下去。但是,如果是返回false让事件传递下去的话这个surfaceView中又不能绘图了。想要达到的效果就是在linearlayout显示出来后,点按钮可以选择颜色,而且不影响原来的绘图功能。
....额,不知道有没有表达清楚,望指教。
下面贴代码
布局文件(不知道怎么去实现控件重叠,直接就上framelayout了):
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:msurface="http://schemas.android.com/apk/res/com.example.testdraw"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<com.example.testdraw.MySurfaceView
android:id="@+id/msurfaceview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
msurface:paintColor="#1C86EE" >
</com.example.testdraw.MySurfaceView>
</FrameLayout>

<LinearLayout
android:id="@+id/layout_top"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:background="@drawable/pchoose_bac"
android:visibility="gone" >

<Button
android:id="@+id/btnred"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/pred" />
<Button
android:id="@+id/btnyell"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/pyell" />
<Button
android:id="@+id/btngreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/pgreen" />
<Button
android:id="@+id/btnblue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/pblue" />
</LinearLayout>

</FrameLayout>



public class MainActivity extends Activity {

private LinearLayout layoutTop;
private static boolean isVisible = false;
private Button btnPaintRed;
private Button btnPaintBlue;
private Button btnPaintYellow;
private Button btnPaintGreen;
private MySurfaceView ms;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.activity_main);

btnPaintRed = (Button)findViewById(R.id.btnred);
btnPaintBlue = (Button)findViewById(R.id.btnred);
btnPaintYellow = (Button)findViewById(R.id.btnred);
btnPaintGreen = (Button)findViewById(R.id.btnred);

ms = (MySurfaceView)findViewById(R.id.msurfaceview);


btnPaintRed.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
ms.paintColor = Color.parseColor("#FF3366");
}
});

...
}

@Override
public boolean onTouchEvent(MotionEvent event) {

int pCount = event.getPointerCount();
if (pCount == 3) {
layoutTop = (LinearLayout) findViewById(R.id.layout_top);

switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_UP:
if (isVisible == true) {
layoutTop.setVisibility(View.GONE);
isVisible = false;
} else {
layoutTop.setVisibility(View.VISIBLE);
isVisible = true;
}
break;
}
}
return true;
}
}


public class MySurfaceView extends SurfaceView implements Callback, Runnable {

public static final int TIME_IN_FRAME = 50;
public int paintColor;

Paint mPaint = null;
Paint mTextPaint = null;
SurfaceHolder mSurfaceHolder = null;

boolean mRunning = false;
Canvas mCanvas = null;
private Path mPath;
private float mPosX, mPosY;

public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
this.setFocusable(true);
this.setFocusableInTouchMode(true);
mSurfaceHolder = this.getHolder();
mSurfaceHolder.addCallback(this);
mCanvas = new Canvas();

/* 获取参数 */
TypedArray tay = context.obtainStyledAttributes(attrs, R.styleable.MySurfaceView );
paintColor = tay.getColor(R.styleable.MySurfaceView_paintColor, 0xFFFFFFFF);

mPaint = new Paint();
//mPaint.setColor(Color.BLUE);
mPaint.setColor(paintColor);
mPaint.setAntiAlias(true);
mPaint.setAlpha(60);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(20);
mPath = new Path();
mTextPaint = new Paint();
mTextPaint.setColor(Color.BLACK);
mTextPaint.setTextSize(15);

tay.recycle();
}
//主要是这里不知道怎么处理,如果return false,绘图直接不显示了。
@Override
public boolean onTouchEvent(MotionEvent event) {

mPaint.setColor(paintColor);

int pCount = event.getPointerCount();
if (pCount == 3) {
return false;
} else {
int action = event.getAction();
float x = event.getX();
float y = event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
mPath.moveTo(x, y);
break;
case MotionEvent.ACTION_MOVE:
mPath.quadTo(mPosX, mPosY, x, y);
break;
case MotionEvent.ACTION_UP:
// mPath.reset();
break;
}
// 记录当前触摸点得当前得坐标
mPosX = x;
mPosY = y;

return true;
}
}

private void onDraw() {
mCanvas.drawColor(Color.WHITE);
// 绘制曲线
mCanvas.drawPath(mPath, mPaint);
mCanvas.drawText("当前触笔X:" + mPosX, 0, 20, mTextPaint);
mCanvas.drawText("当前触笔Y:" + mPosY, 0, 40, mTextPaint);
}

public void run() {
// TODO Auto-generated method stub
while (mRunning) {
long startTime = System.currentTimeMillis();
synchronized (mSurfaceHolder) {
mCanvas = mSurfaceHolder.lockCanvas();
onDraw();
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
long endTime = System.currentTimeMillis();
int diffTime = (int) (endTime - startTime);
while (diffTime <= TIME_IN_FRAME) {
diffTime = (int) (System.currentTimeMillis() - startTime);
Thread.yield();
}
}
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
mRunning = true;
new Thread(this).start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mRunning = false;
}

}
...全文
550 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
liao_hb 2015-09-19
  • 打赏
  • 举报
回复
同问阿,问题解决了嘛?搂住?
yel_hb 2013-04-08
  • 打赏
  • 举报
回复
引用 2 楼 shen332401890 的回复:
http://blog.csdn.net/shen332401890/article/details/8572732 链接发错了 是这个
谢谢,不过好像还是不行,网上很多谈事件传递的都是一层一层往下传递,没有同层的。就像我上面这个,在第一个framelayout下面有两个layout,同级,surfaceview能拦截到点击事件,但是linearlayout中的button却拦截不到。之前的都设成false也没用。
顾小林 2013-04-07
  • 打赏
  • 举报
回复
http://blog.csdn.net/shen332401890/article/details/8572732 链接发错了 是这个
顾小林 2013-04-07
  • 打赏
  • 举报
回复
你可以再 ontouch 的down 消息 return false 然后move 了以后处理你这个 surfaceView的事件 http://blog.csdn.net/shen332401890/article/details/8627165 看一下这个 里面有几篇别人的文章介绍的很详细

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧