自定义view不显示,跪求答案

浪中云 2011-07-28 04:22:31
package cc.pic;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Bitmap.Config;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class MyView extends View {

public void setBmp1(Bitmap bmp1) {
this.bmp1 = bmp1;
mBitmap=bmp1;
}

Canvas mCanvas;
Bitmap mBitmap, bmp1, bmp2;
Paint mPaint;
int flag = 0;
float movex, movey, lastx, lasty, initx, inity, initx2, inity2;
float X_r, Y_r;

public MyView(Context context) {
super(context);
X_r = 0;
Y_r = 0;
init();
}

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
X_r = 0;
Y_r = 0;
init();

}

public void init() {

if(mBitmap != null)
{
mBitmap =Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), Config.ARGB_8888);
mCanvas=new Canvas(mBitmap);
mPaint=new Paint();
mPaint.setColor(0xFFFFFFFF);
// drawImage(bmp2, 50, 0);
drawImage(bmp1, 150, 150);
}
else
{
mBitmap=null;
}
Toast.makeText(getContext(), "init ing ", 1).show();
}

protected void onDraw(Canvas canvas) {
if(mBitmap!=null)
{
canvas.drawColor(0xa1a1a1);
canvas.drawBitmap(mBitmap, X_r, Y_r, mPaint);
Toast.makeText(getContext(), "ondraw "+flag, 1).show();
}
flag++;
super.onDraw(canvas);
}

List<HashMap> list = new ArrayList<HashMap>();
HashMap map = null;

/* 在给定的位置画位图记录好他们的初始化坐标,放入一个集合中 */
public void drawImage(Bitmap bmp, float x, float y) {

if (bmp == null)
return;

/* 记录好图片坐标 */
map = new HashMap();
map.put("x", x);
map.put("y", y);
map.put("bmp", bmp);
list.add(map);
Log.d("MyView", "drawImage--->" + initx + ":" + inity);
float x_1 = bmp1.getWidth() / 2;
float y_1 = bmp1.getHeight() / 2;
mCanvas.drawBitmap(bmp, x - x_1, y - y_1, mPaint);
Toast.makeText(getContext(), "drawImage ", 1).show();
invalidate();
}

/* 传入点击的坐标点获得位图 */
public Bitmap bmpClick(float mx, float my) {
Bitmap bmpy = null;
HashMap hashMap = null;
for (Iterator<HashMap> it = list.iterator(); it.hasNext();) {
hashMap = it.next();
float dx = Float.parseFloat(hashMap.get("x").toString());// 获取到它的初始化X坐标
float dy = Float.parseFloat(hashMap.get("y").toString());// 获取到它的初始化Y坐标
bmpy = (Bitmap) hashMap.get("bmp");// 获取到它的初始化的位图
Log.i("MyView", "bmpClick---> " + dx + ":" + dy);
if (mx >= (dx - bmpy.getWidth() / 2)
&& mx <= (dx + bmpy.getWidth() / 2)
&& my >= (dy - bmpy.getHeight() / 2)
&& my <= (dy + bmpy.getHeight() / 2)) {
return bmpy;
}
}
return null;
}

public float getX_r() {
return X_r;
}

public float getY_r() {
return Y_r;
}

public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();

switch (event.getAction()) {
// 点击时的(x,y),记录初始位置
case MotionEvent.ACTION_DOWN:
mDragBitmap = bmpClick(x, y);
break;
// 移动时更新(x,y),同时更新图片
case MotionEvent.ACTION_MOVE:
if (mDragBitmap != null) {
if (mDragBitmap.equals(bmp1)) {
movex = bmp1.getWidth() / 2;
movey = bmp1.getHeight() / 2;
mBitmap = bmp1.copy(Bitmap.Config.ARGB_8888, true);
X_r = x - movex;
Y_r = y - movey;
invalidate();
}
/*
* else{ movex = bmp2.getWidth()/2; movey = bmp2.getHeight()/2;
* mBitmap = bmp2.copy(Bitmap.Config.ARGB_8888, true); X_r =
* x-movex; Y_r = y-movey; invalidate(); }
*/
}
break;

// 弹起时更新(x,y),并记录位置
case MotionEvent.ACTION_UP:

if (mDragBitmap != null) {
map = new HashMap();
map.put("x", x);
map.put("y", y);
map.put("bmp", mDragBitmap);
list.add(map);
Log.e("bitmap list", "insert finish : [" + x + "," + y + "]");
}
mDragBitmap = null;
break;
}
return true;
}

private Bitmap mDragBitmap = null;
}

...全文
761 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
浪中云 2011-08-02
  • 打赏
  • 举报
回复
顶啊。。求解啊
浪中云 2011-08-01
  • 打赏
  • 举报
回复
顶啊,求解啊
浪中云 2011-07-29
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#666666">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/a"
android:padding="20dp"
android:id="@+id/wordImageView" />
<cc.test.MyView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:id="@+id/myview1"></cc.test.MyView>
<Gallery
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:id="@+id/wordGalleryView" />
</Relati

重新说一下,
就是Gallery中点一下图片不出现。。。。拖动才回出现。。。
再点击gallery中其他的图片也是不显示,拖动不出现,,,
但是让他与背景图片合成,图片就显示出来了
浪中云 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yangting_lisa 的回复:]

引用 1 楼 wgsddfe 的回复:

这个是自定义的view,可以实现图片拖动功能,我在主activity中点击gallery中的图片,view就自动更新图片
在我第一次点击图片的时候,不显示,但是点击之后会显示,再点击其他图片,怎么点击都不出现,求解,
主界面中更新了myView.setBmp1(b1);
myView.init();
myView.requestFocus()……
[/Quote]
View代码就是1L,点击的时候,其实View已经有了,
我把两张图片合成,那个View里面的图片显示出来了
浪中云 2011-07-29
  • 打赏
  • 举报
回复
package cc.test;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class cropPoc extends Activity{

private ImageView wordView;
private MyView myView = null;
private Gallery gallery;

Integer[] word={
R.drawable.funny1,
R.drawable.rotate,
R.drawable.tab_b,
};

protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

gallery=(Gallery) this.findViewById(R.id.wordGalleryView);
wordView = (ImageView) this.findViewById(R.id.wordImageView);
myView=(MyView)this.findViewById(R.id.myview1);
gallery.setAdapter(new ImageAdapterss(getApplicationContext(), word));
gallery.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Bitmap b;
switch(position)
{

case 0:
b=BitmapFactory.decodeResource(getResources(), R.drawable.funny1);
myView.setBmp1(b);
myView.init();
myView.requestFocus();
myView.invalidate();
break;
case 1:
b=BitmapFactory.decodeResource(getResources(), R.drawable.rotate);
myView.setBmp1(b);
myView.init();
myView.requestFocus();
myView.invalidate();
break;
case 2:
b=BitmapFactory.decodeResource(getResources(), R.drawable.tab_b);
myView.setBmp1(b);
myView.init();
myView.requestFocus();
myView.invalidate();
break;
}

}
});
}

}
class ImageAdapterss extends BaseAdapter {

private Context mContext;
private Integer[] mImageIds;

public ImageAdapterss(Context mContext, Integer[] mImageIds) {
this.mContext = mContext;
this.mImageIds = mImageIds;
}

public int getCount() {
return mImageIds.length;
}

public Object getItem(int position) {
return position;
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageview = new ImageView(mContext);
// 设置资源
imageview.setImageResource(mImageIds[position]);
// 设置布局图片的分辨率
imageview.setLayoutParams(new Gallery.LayoutParams(80, 80));
// 设置显示的类型
imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);
return imageview;
}
}

小笨熊 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wgsddfe 的回复:]

这个是自定义的view,可以实现图片拖动功能,我在主activity中点击gallery中的图片,view就自动更新图片
在我第一次点击图片的时候,不显示,但是点击之后会显示,再点击其他图片,怎么点击都不出现,求解,
主界面中更新了myView.setBmp1(b1);
myView.init();
myView.requestFocus();
myView.invalidate();……
[/Quote]

点击没有反应,说明你没有重新绘制view导致。你可以把你的activity和view源码贴上,我帮你看看
浪中云 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yangting_lisa 的回复:]

恩,你没有复写父类onMeasure方法。这个方法是view的绘制的。一旦这个方法没有就不肯能有view出现。
[/Quote]
我看了3L的话,就去查了,写了onmeasure也没用啊。。发现
小笨熊 2011-07-29
  • 打赏
  • 举报
回复
恩,你没有复写父类onMeasure方法。这个方法是view的绘制的。一旦这个方法没有就不肯能有view出现。
浪中云 2011-07-29
  • 打赏
  • 举报
回复
谢谢你的建议,第三点是因为初始化的时候MyView是没有图的,是点击gallery之后给MyView传值,inite(),你看我的代码就知道是啥意思了
要实现的功能是:
点击gallery。。界面出现那个图,并且可以移动,最后点击确定按钮背景图片和MyView进行合成,
然后我现在遇到的问题是,点击gallery不出现 图片,由于MyView中有拖动时间,我拖动一下,图片就出现了,
然后点击其他图片的时候,图片不显示,拖动,也不出现
语文不好,表达能力欠缺,抱歉。。。这次应该讲明白了。。。在线等回复
小笨熊 2011-07-29
  • 打赏
  • 举报
回复
lz首先不说功能,我看了你的代码,有几点小建议:
1.类名以大写字母开头。
2.CropPoc类中用switch进行判断的时候,你的代码可以优化的。
switch(position) {
case 0:
b=BitmapFactory.decodeResource(getResources(), R.drawable.bear);
case 1:
b=BitmapFactory.decodeResource(getResources(), R.drawable.dog);
case 2:
b=BitmapFactory.decodeResource(getResources(), R.drawable.rabbit);
default:
myView.setBmp1(b);
//myView.init();
myView.requestFocus();
myView.invalidate();
break;
}
3.switch中的myView.init(),你在myview中的构造方法中已经调用了,怎么在这边还调用。
4.你定义的ImageView都没有用,影响代码可读性。

最后一点,你要实现什么功能?
就是Gallery中点一下图片不出现。。。。拖动才回出现。。。
再点击gallery中其他的图片也是不显示,拖动不出现,,,
但是让他与背景图片合成,图片就显示出来了
我不太明白你这句话。
小笨熊 2011-07-29
  • 打赏
  • 举报
回复
sorry,今天有点忙,稍后给你看看哦。
ch_984326013 2011-07-28
  • 打赏
  • 举报
回复
会报错么?发过来,我看下!Q:984326013
浪中云 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nliuser 的回复:]

一般还需要重新这个方法。protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
[/Quote]
能说清楚点吗?
nliuser 2011-07-28
  • 打赏
  • 举报
回复
一般还需要重新这个方法。protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
浪中云 2011-07-28
  • 打赏
  • 举报
回复
米有人吗?自己顶一个先
浪中云 2011-07-28
  • 打赏
  • 举报
回复
这个是自定义的view,可以实现图片拖动功能,我在主activity中点击gallery中的图片,view就自动更新图片
在我第一次点击图片的时候,不显示,但是点击之后会显示,再点击其他图片,怎么点击都不出现,求解,
主界面中更新了myView.setBmp1(b1);
myView.init();
myView.requestFocus();
myView.invalidate();
跪求大神指点

80,352

社区成员

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

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