GVKun编程网logo

如何绘制不同颜色的多行并撤消,重做android中的路径?(怎么删除不同颜色的行)

13

本文将带您了解关于如何绘制不同颜色的多行并撤消,重做android中的路径?的新内容,同时我们还将为您解释怎么删除不同颜色的行的相关知识,另外,我们还将为您提供关于Android---TextView

本文将带您了解关于如何绘制不同颜色的多行并撤消,重做android中的路径?的新内容,同时我们还将为您解释怎么删除不同颜色的行的相关知识,另外,我们还将为您提供关于Android --- TextView 中文本的不同颜色、Android listview 不同的项底色不同,点击再变不同颜色、Android Oreo如何从uri获得真正的路径?、Android View如何绘制的实用信息。

本文目录一览:

如何绘制不同颜色的多行并撤消,重做android中的路径?(怎么删除不同颜色的行)

如何绘制不同颜色的多行并撤消,重做android中的路径?(怎么删除不同颜色的行)

我想在视图上用不同颜色绘制多条线并撤消,重做 android中的路径.

我使用位图绘制选项,每个路径都有一个唯一的颜色但撤消,重做不起作用..

这是我的bitmappaint代码:

public MyView(Context context,Object object) {
    super(context);
    setFocusable(true);
    setFocusableInTouchMode(true);

    mPath = new Path();
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setColor(0xFFFFFF00);
    mPaint.setStyle(Paint.Style.stroke);
    mPaint.setstrokeJoin(Paint.Join.ROUND);
    mPaint.setstrokeCap(Paint.Cap.ROUND);
    mPaint.setstrokeWidth(3);

    mBitmap = Bitmap.createBitmap(320,480,Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mBitmap);
}

protected void onSizeChanged(int w,int h,int oldw,int oldh) 
{
    super.onSizeChanged(w,h,oldw,oldh);
}

protected void onDraw(Canvas canvas) 
{
    canvas.drawBitmap(mBitmap,mBitmapPaint);
    for (Path p : paths)
    {
        canvas.drawPath(p,mPaint);
    }
    canvas.drawPath(mPath,mPaint);
}

public boolean onTouchEvent(MotionEvent event)
{
    float x = event.getX();
    float y = event.getY();
    int action = event.getAction();
    int action1=event.getAction();
    switch (event.getAction())
    {
    case MotionEvent.ACTION_DOWN:
        undonePaths.clear();
        mPath.reset();
        mPath.moveto(x,y);
        mX = x;
        mY = y;
        startPoint = new PointF(event.getX(),event.getY());
        endPoint = new PointF();
        invalidate();
        //   isDrawing = true;
        break;
    case MotionEvent.ACTION_MOVE:
        float dx = Math.abs(x - mX);
        System.out.println("action move");
        float dy = Math.abs(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE)
        {
            //  currentDrawingPath.path.quadTo(mX,mY,(x + mX)/2,(y + mY)/2);
        }
        mX = x;
        mY = y;
        endPoint.x = event.getX();
        endPoint.y = event.getY();
        isDrawing = true;
        invalidate();
        break;
    case MotionEvent.ACTION_UP:
        mPath.lineto(mX,mY);
        paths.add(mPath);
        mPath = new Path();
        //  mCanvas.drawPath(mPath,ppaint);
        endPoint.x = event.getX();
        endPoint.y = event.getY();
        isDrawing = false;
        invalidate();
        break;
    default:
        break;
    }       
}

![bitmappaint canvas的输出] [1]
     [1]:http://i.stack.imgur.com/9aQvE.png

没有位图使用我遇到颜色问题,如果我为路径选择蓝色意味着所有以前的路径将改为蓝色;

这是我的代码

protected void onDraw(Canvas canvas) 
{
    canvas.drawBitmap(mBitmap,mPaint);
}

![使用画布绘制无位图的输出] [2]
      [2]:http://i.stack.imgur.com/eDp5Y.png

请帮我在android中绘制具有不同颜色的独特路径的多条路径.
谢谢advancde ……..

解决方法

处理MotionEvent.ACTION_UP时:需要保存用于绘制路径的颜色,如下所示:

case MotionEvent.ACTION_UP:
    paths.add(mPath);
    colorsMap.put(mPath,selectedColor); // store the color of mPath
    ...

在绘制路径之前,您需要设置绘制颜色:

protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(mBitmap,mBitmapPaint);
    for (Path p : paths)
    {
        mPaint.setColor(colorsMap.get(p));
        canvas.drawPath(p,mPaint);
    }
    mPaint.setColor(selectedColor);
    canvas.drawPath(mPath,mPaint);
}

而colorsMap是一个简单的实例变量:

private Map<Path,Integer> colorsMap = new HashMap<Path,Integer>();

要实现撤消/重做功能,您只需从路径中删除最后一个元素(并将其存储在undoneList中,以便重做时可以恢复它).见Android Canvas Redo and Undo Operation

Android --- TextView 中文本的不同颜色

Android --- TextView 中文本的不同颜色

 面试其中有一道题是:

TextView 中文本的颜色设置?例如:中软国际,其中中软为红色,国际为绿色。

方法一: 

<LinearLayout
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal">
  <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="中软"
   android:textColor="#FFFF0000" />
  <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="国际"
   android:textColor="#FF00FF00" />
 </LinearLayout>

 

方法二:

package me.lechao;

import android.app.Activity;
import android.os.Bundle;
import android.text.Html;
import android.widget.TextView;

public class MainActivity extends Activity {
	/** 利用HTML语言,改变文字颜色 */
	private void init() {
		String str = "<font color=''red''>中软</font>"
				+ "<font color= ''green''>国际</font>";
		TextView tv = new TextView(this);
		tv.setText(Html.fromHtml(str));
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}
}

 

PS:凡是不要想的太复杂。简简单单就好。


原文链接: http://blog.csdn.net/bys0201/article/details/7246313

Android listview 不同的项底色不同,点击再变不同颜色

Android listview 不同的项底色不同,点击再变不同颜色

需求变更,android版本的app需要对listview的不同项设置不同的颜色,并且点击之后,底色再变。

先给一个效果图。

先讲讲业务,listview里面的数据是动态的,而底色图片是从网络上下载下来。当点击了某一个选择项之后,再把这张图片下载下来,更新listview.

怎么从网络下载图片,这个不是我要讲的重点,今天重点讲怎么实现listview设置不同的图片信息,然后点击了某一项数据之后,再把图片更新。

    首先,这里讲讲selecter,大家都知道,直接在drawable下面写一个xml文件,为selecter,代码如下:

<?xml version="1.0" encoding="utf-8" ?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_window_focused="false" android:drawable="@drawable/xinwen" />

    <item android:state_focused="true" android:state_pressed="true"     

        android:drawable="@drawable/xinwen1" /> 

    <item android:state_focused="false" android:state_pressed="true"

        android:drawable="@drawable/xinwen1" />

    <item android:state_selected="true" android:drawable="@drawable/xinwen1" />

    <item android:state_focused="true" android:drawable="@drawable/xinwen1" />

    <item android:drawable="@drawable/xinwen"/> 

</selector>

这里面的各个item项分别是操作listview得到的效果,例如state_selected为真的时候,会显示另外的图片底色。笔者试过,这种方式适合的业务是点击变色的底色为固定的,例如本来是红色的,点击变成绿色,所有的项都是这种效果。

    然后,再说说在Adapter里面添加效果的方法。直接贴代码吧:

public View getView(int position, View convertView, ViewGroup parent) {

if (convertView == null) {

convertView = LayoutInflater.from(mContext).inflate(

R.layout.mainmenulistitem, null);//获得listview项的布局文件

viewHolder = new ViewHolder();

viewHolder.qunTitle = (TextView) convertView

.findViewById(R.id.leftlistquntitle);

viewHolder.mImageView = (RelativeLayout) convertView

.findViewById(R.id.leftqunimage);

//用viewHolder暂时存着文字信息和项的背景,这里选择相对布局的方式,因为考虑到适配问题。

convertView.setTag(viewHolder);

} else {

viewHolder = (ViewHolder) convertView.getTag();

}

temp =  qunFatherList.get(position);  //数据项,这里的数据为要加载的文字信息

if(!isLeftlistClick)//没有点击的时候,就是第一次加载的时候,都不用变色

setAdapterContent();  

else{

setAdapterClick();//点击了某一项的时候的方法

}

return convertView;

}

private void setAdapterContent() { //把数据和图片set到adapter里面

if(temp.get("Qun_Title").equals("收藏夹")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.shoucang);

}else if(temp.get("Qun_Title").equals("所有栏目")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.suoyoulanmu1);

}else if(temp.get("Qun_Title").equals("摇一摇")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.yaoyiyao);

}else if(temp.get("Qun_Title").equals("兼职就业")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.jianzhijiuye);

}else if(temp.get("Qun_Title").equals("公文通")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.gongwentong);

}else if(temp.get("Qun_Title").equals("校园生活")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.xiaoyuanshenghuo);

}else if(temp.get("Qun_Title").equals("学院动态")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.xueyuandongtai);

}else if(temp.get("Qun_Title").equals("校园社交")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.xiaoyuanshejiao);

}else{

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.xinwen);

}

}

点击之后变色要如何变色呢,这里没有想到好的方法,就用了一个比较笨的办法,就是传多一个参数到这个adapter来,然后对这个参数判断,这个参数为点击listview的第几项的值,然后用switch... case 0:{}  case :1{}做操作。

如果传过来的是0,就把列表的第一个图片设成底色图片,其他的设置为原来的图片,如此类推。

switch(p){

case 0 :{

if(temp.get("Qun_Title").equals("收藏夹")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.shoucang1);//设置图片变化。

}else if(temp.get("Qun_Title").equals("所有栏目")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.suoyoulanmu);

}else if(temp.get("Qun_Title").equals("摇一摇")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.yaoyiyao);

}else if(temp.get("Qun_Title").equals("公文通")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.gongwentong);

}

else if(temp.get("Qun_Title").equals("兼职就业")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.jianzhijiuye);

}else if(temp.get("Qun_Title").equals("校园生活")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.xiaoyuanshenghuo);

}

else if(temp.get("Qun_Title").equals("学院动态")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.xueyuandongtai);

}else if(temp.get("Qun_Title").equals("校园社交")){

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.xiaoyuanshejiao);

}else{

viewHolder.qunTitle.setText(temp.get("Qun_Title"));

viewHolder.mImageView.setBackgroundResource(R.drawable.xinwen);

}

break;

}

实现了以上的需求。


Android Oreo如何从uri获得真正的路径?

Android Oreo如何从uri获得真正的路径?

我正在使用此代码从URI获取真实路径.它正在努力
棉花糖但不在奥利奥:

private String getPathNew(Activity activity, Uri uri) { 
    if (isDownloadsDocument(uri)) {
        final String id = DocumentsContract.getDocumentId(uri);
        final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
        return getDataColumn(activity, contentUri, null, null);
    }
    return null;
}

public static String getDataColumn(Context context, Uri uri, String 
selection, String[] selectionArgs) {
    Cursor cursor = null;
    final String column = "_data";
    final String[] projection = {column};
    try {
        cursor = context.getContentResolver().query(uri, projection, selection, 
selectionArgs, null);
        if (cursor != null && cursor.movetoFirst()) {
            final int column_index = cursor.getColumnIndexOrThrow(column);
            return cursor.getString(column_index);
        }
    } finally {
        if (cursor != null)
            cursor.close();
    }
    return null;
}

我究竟做错了什么?

解决方法:

 public static String getRealPathFromURI(Context context, Uri contentUri) {
    String[] proj = {MediaStore.Images.Media.DATA};
    Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, 
                                                                               null);
    if (cursor != null) {
        int column_index = 
        cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.movetoFirst();
        return cursor.getString(column_index);
    }
    return null;
}

Android View如何绘制

Android View如何绘制

上文说道了Android如何测量,但是一个漂亮的控件我只知道您长到哪儿,这当然不行。只需要简单重写OnDraw方法,并在Canvas(画布)对象上调用那根五颜六色的画笔就能够画出这控件"性感"的外表。那么View又是如何进行绘制了?

  要了解View如何绘制,就需要了解canvas(画布)是什么?paint(画笔)能够做什么。

  Ⅰ、canvas就是表示一块画布,你可以在上面画你所朝思暮想的东西。当我们重写onDraw方法的时候,就能够拿到一个Canvas对象,这个就是你的舞台,画你所思所想。上代码了。

@Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
  }

   当您需要对某某控件进行进行重新绘制的时候,我们只需要在这个大舞台(Canvas)调用Canvas.DrawXXX方法画出各种各样的图形。

  Ⅱ、paint就是画布上挥洒自如的画笔。要画图,得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上。Paint上提供许多属性和方法用来设置画笔。

  1、setAntiAlias: 设置画笔的锯齿效果。
  2、setColor: 设置画笔颜色
  3、setARGB:  设置画笔的a,r,p,g值。
  4、setAlpha:  设置Alpha值
  5、setTextSize: 设置字体尺寸。
  6、setStyle:  设置画笔风格,空心或者实心。
  7、setstrokeWidth: 设置空心的边框宽度。
  8、getColor:  得到画笔的颜色
  9、getAlpha:  得到画笔的Alpha值。

  我们既然知道了画笔与画布,通过一个短小精悍的例子来看画布和画笔怎么共同作用出一个想要的图形。老样子,上代码:

public class MyView extends View {

  private Paint paint;
  public MyView(Context context,AttributeSet attrs) {
    super(context,attrs);
    init();
  }

  private void init() {
    paint=new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.RED);
    paint.setstrokeWidth(5);
    paint.setTextSize(28);
    
  }

  @Override
  protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {
    setMeasuredDimension(measureWidth(widthMeasureSpec),measureWidth(heightMeasureSpec));
  }

  public int measureWidth(int measureSpec) {
    int result = 0;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specsize = MeasureSpec.getSize(measureSpec);
    if (specMode == MeasureSpec.EXACTLY) {
      result = specsize;
    } else {
      result = 200;
      if (specMode == MeasureSpec.AT_MOST) {
        result = Math.min(specsize,result);
      }
    }
    return result;
  }
  
  @Override
  protected void onDraw(Canvas canvas) {
    canvas.drawText("中国",80,paint);
    super.onDraw(canvas);
  }
}


上述代码,我们做了这么几件事了:

  Ⅰ、我们运用上篇文章的知识,重写了onMeasure方法,让这个简单自定义控件自适应wrap_content属性。

  Ⅱ、我们调用了OnDraw方法,拿到Canvas与paint,在view上写了"中国"文字。

  最终运行效果为:

  这就是我对Android View 如何绘制一点灼见,希望大家多提建议。

关于如何绘制不同颜色的多行并撤消,重做android中的路径?怎么删除不同颜色的行的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android --- TextView 中文本的不同颜色、Android listview 不同的项底色不同,点击再变不同颜色、Android Oreo如何从uri获得真正的路径?、Android View如何绘制等相关知识的信息别忘了在本站进行查找喔。

本文标签: